使用autofac创建需要参数的对象的正确方法是什么?

Ste*_*hen 1 c# autofac

我认为我得到了关于依赖倒置和使用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的引用?

Ste*_*hen 7

解决此问题的方法如下:

更改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)