配置在抽象类上定义的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>();