配置在抽象类上定义的Autofac委托工厂
我正在研究一个C#项目。 我正在尝试摆脱具有大型switch
语句的Factory类。
我想配置Autofac以便能够基于参数构造依赖关系,从而允许Autofac取代Factory。
我查看了Autofac wiki的DelegateFactories页面 ,但我无法弄清楚如何将模式应用于抽象类。 以下是一些显示情况的代码:
public enum WidgetType { Sprocket, Whizbang } public class SprocketWidget : Widget { } public class WhizbangWidget : Widget { } public abstract class Widget { public delegate Widget Factory(WidgetType widgetType); } public class WidgetWrangler { public Widget Widget { get; private set; } public WidgetWrangler(IComponentContext context, WidgetType widgetType) { var widgetFactory = context.Resolve(); Widget = widgetFactory(widgetType); } }
我喜欢它,如果我说new WidgetWrangler(context, WidgetType.Sprocket)
,它的Widget
属性将是一个SpocketWidget
。
当我尝试这个时,我收到错误,说明Widget.Factory
没有注册。 此委托工厂模式是否不适用于抽象类,如果是,是否有另一种方法可以实现此目的?
您正在寻找的是IIndex<,>
关系类型。
如果使用.Keyed<>(...)
注册子类, .Keyed<>(...)
可以将注册键入值( object
)。
例如:
builder.RegisterType() .Keyed(WidgetType.Sproket) .InstancePerDependency(); builder.RegisterType() .Keyed(WidgetType.Whizbang) .InstancePerDependency();
然后,您只需要依赖IIndex
来模仿工厂行为。
public class SomethingThatUsesWidgets { private readonly IIndex _widgetFactory; public SomethingThatUsesWidgets(IIndex widgetFactory) { if (widgetFactory == null) throw ArgumentNullException("widgetFactory"); _widgetFactory = widgetFactory; } public void DoSomething() { // Simple usage: Widget widget = widgetFactory[WidgetType.Whizbang]; // Safe Usage: Widget widget2 = null; if(widgetFactory.TryGetValue(WidgetType.Sprocket, out widget2)) { // do stuff } } }
如果您只想解决工厂问题,那就是使用dependency injection方法:
var factory = Container.Resolve>();