配置在抽象类上定义的Autofac委托工厂

本文关键字:Autofac 工厂 定义 抽象类 配置 | 更新日期: 2023-09-27 18:09:30

我正在做一个c#项目。我试图摆脱一个工厂类,有一个大的switch语句。

我想配置autofacc,使其能够基于参数构造依赖项,从而允许autofacc代替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.Factory>();
        Widget = widgetFactory(widgetType);
    }
}

我想如果我说new WidgetWrangler(context, WidgetType.Sprocket),它的Widget性质将是SpocketWidget

当我尝试这样做时,我得到错误,说明Widget.Factory未注册。这个委托工厂模式不能与抽象类一起工作吗?如果是这样,是否有其他方法可以实现这一点?

配置在抽象类上定义的Autofac委托工厂

您正在寻找的是IIndex<,>关系类型。

如果你用.Keyed<>(...)注册你的子类,你可以注册一个值(object)。

例如:

builder.RegisterType<SprocketWidget>()
   .Keyed<Widget>(WidgetType.Sproket)
   .InstancePerDependency();
builder.RegisterType<WhizbangWidget>()
   .Keyed<Widget>(WidgetType.Whizbang)
   .InstancePerDependency();

那么你只需要一个IIndex<WidgetType,Widget>的依赖来模拟工厂行为。

public class SomethingThatUsesWidgets
{    
    private readonly IIndex<WidgetType,Widget> _widgetFactory;
    public SomethingThatUsesWidgets(IIndex<WidgetType,Widget> 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
        }
    }
}

这是使用依赖注入的方法,如果你只想解决工厂:

var factory = Container.Resolve<IIndex<WidgetType,Widget>>();