我必须根据从服务器收到的一些消息/属性在运行时创建实现,这些消息/属性也需要由新创建的对象进行转换.我是Autofac的新手,但据我所知,有两种方法可以解决这个问题.
... 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; } }
... 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; }; });
问题:
我认为这可能是一个主观的事情,但无论如何我想问.
>哪种方法更可取,为什么?
>还有更好的解决方案吗?
>是否真的有必要在“方法2”中存储上下文?
编辑
好吧,我用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>>();