c# – Autofac:注册Func <>或Factory?
发布时间:2020-12-15 07:50:07 所属栏目:百科 来源:网络整理
导读:我必须根据从服务器收到的一些消息/属性在运行时创建实现,这些消息/属性也需要由新创建的对象进行转换.我是Autofac的新手,但据我所知,有两种方法可以解决这个问题. 方法1:注册专用工厂 ...builder.RegisterTypeMTextField().KeyedIComponent(typeof(TextFie
我必须根据从服务器收到的一些消息/属性在运行时创建实现,这些消息/属性也需要由新创建的对象进行转换.我是Autofac的新手,但据我所知,有两种方法可以解决这个问题.
方法1:注册专用工厂 ... builder.RegisterType<MTextField>().Keyed<IComponent>(typeof(TextFieldProperties)); builder.RegisterType<ComponentFactory>().As<IComponentFactory>(); public class ComponentFactory : IComponentFactory { private readonly IIndex<Type,IComponent> _lookup; public ComponentFactory(IIndex<Type,IComponent> lookup) { _lookup = lookup; } public IComponent Create(ComponentProperties properties) { var component = _lookup[properties.GetType()]; component.Transform(properties); return component; } } 方法2:根据funcs注册 ... builder.RegisterType<MTextField>().Keyed<IComponent>(typeof(TextFieldProperties)); builder.Register<Func<ComponentProperties,IComponent>>(c => { var context = c.Resolve<IComponentContext>(); return properties => { var component = context.ResolveKeyed<IComponent>(properties.GetType()); component.Transform(properties); return component; }; }); 问题: 我认为这可能是一个主观的事情,但无论如何我想问. >哪种方法更可取,为什么? 编辑 好吧,我用autofac玩了一下.这是我目前的做法: public class TransformerFactory<D,T> : ITransformFactory<D,T> where T : ITransform<D> { private readonly IIndex<Type,T> _lookup; public TransformerFactory(IIndex<Type,T> lookup) { _lookup = lookup; } public T Create(D data,Action<T> prepareInstance = null) { var instance = _lookup[data.GetType()]; if (prepareInstance != null) { prepareInstance(instance); } instance.Transform(data); return instance; } } builder.RegisterGeneric(typeof(TransformerFactory<,>)).As(typeof(ITransformFactory<,>)); // e.g. var x = container.Resolve<ITransformFactory<ComponentProperties,IComponent>>(); 解决方法
第一种方法似乎是更好的方法.我提供的两个原因是:
> Keyed和IIndex为手头的任务提供了充足而清晰的开箱即用解决方案.方法2使用更通用的工具,需要您工作的其他逻辑(即您编写代码以调用ResolveKeyed).如果有一个简单的特定于目的的解决方案,那么优先使用它来获得更通用的解决方案.>方法1将能够正确管理生命周期和范围.正如您所提出的,方法2捕获上下文,并将针对该上下文解析单个实例.这意味着单个实例的生命周期将基于工厂的范围和生命周期,而不是针对各个服务指定的生命周期策略. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |