neo*_*pir 4 c# delegates factory 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.Factory>();
Widget = widgetFactory(widgetType);
}
}
Run Code Online (Sandbox Code Playgroud)
我想要它,如果我要说new WidgetWrangler(context, WidgetType.Sprocket)
,它的Widget
财产将是一个SpocketWidget
.
当我尝试这个时,我得到的错误表明Widget.Factory
没有注册.此委托工厂模式是否不适用于抽象类,如果是,是否有另一种方法可以实现此目的?
Are*_*ren 13
您正在寻找的是IIndex<,>
关系类型.
如果您注册子类,则.Keyed<>(...)
可以将注册键入值(object
).
例如:
builder.RegisterType<SprocketWidget>()
.Keyed<Widget>(WidgetType.Sproket)
.InstancePerDependency();
builder.RegisterType<WhizbangWidget>()
.Keyed<Widget>(WidgetType.Whizbang)
.InstancePerDependency();
Run Code Online (Sandbox Code Playgroud)
那么你只需要依赖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
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只想解决工厂问题,那就是使用依赖注入方法:
var factory = Container.Resolve<IIndex<WidgetType,Widget>>();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4376 次 |
最近记录: |