我认为我得到了关于依赖倒置和使用IoC容器的大部分内容,但有一件事对我来说仍然不明显.如何使用autofac自动执行以下工厂:
public class WidgetFactory
{
public static IWidget Create(int foo, double bar)
{
return new Widget(foo, bar);
}
}
public class Widget
{
private readonly int foo;
private readonly double bar;
public Widget(int foo, double bar)
{
this.foo = foo;
this.bar = bar;
}
}
Run Code Online (Sandbox Code Playgroud)
别处...
public class FoobarUser
{
public void Method()
{
var widget = WidgetFactory.Create(3, 4.863);
// Do something with my widget
// Possibly add it to a widget collection
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我需要创建数千个小部件,我不确定这样做的最佳方式.我如何使用autofac创建小部件工厂?如何在Method中使用它,请记住Method不包含对IContainer的引用?
解决此问题的方法如下:
更改WidgetFactory以定义用于创建窗口小部件的委托:
public class WidgetFactory
{
public delegate IWidget Create(int firstParam, double secondParam);
}
Run Code Online (Sandbox Code Playgroud)
在autofac模块中,使用RegisterGeneratedFactory方法连接工厂.这将自动为您创建工厂:
public class TestClassModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
builder.RegisterType<Widget>().As<IWidget>();
builder.RegisterGeneratedFactory<WidgetFactory.Create>(new TypedService(typeof(IWidget)));
builder.RegisterType<FoobarUser>();
}
}
Run Code Online (Sandbox Code Playgroud)
将工厂注入FoobarUser:
public class FoobarUser
{
private readonly WidgetFactory.Create factory;
public FoobarUser(WidgetFactory.Create factory)
{
this.factory = factory;
}
public void Method()
{
var widget = this.factory(3, 4.836);
// Do something with my widget
// Possibly add it to a widget collection
}
}
Run Code Online (Sandbox Code Playgroud)