注册类型与工厂代表

时间:2011-08-23 10:40:42

标签: c# .net autofac

在Autofac中是否有办法注册一个带有工厂委托的类型,该委托在请求该类型时被调用? 像这样:

builder.RegisterType<MyType>().AsSelf()
       .WithFactory((IMyService s, ISomeDependency d) =>
                    {
                        var p1 = s.DoSomething();
                        var p2 = d.DoSomething(p1, true);
                        return new MyType(p1, p2);
                    });

1 个答案:

答案 0 :(得分:2)

这可能不是你期望的,但确实可以解决问题:

builder.Register<MyType>(container =>
{
    var s = container.Resolve<IMyService>();  
    var d = container.Resolve<ISomeDependency>();

    var p1 = s.DoSomething();
    var p2 = d.DoSomething(p1, true);
    return new MyType(p1, p2);
});

或者如果你想使用自动(构造函数)注入,你可以创建一个MyType子类(在Composition Root内),它接受两个依赖项。这种类型很容易注册:

builder.RegisterType<AutofacMyType().As<MyType>();

// Define inside Composition Root
private sealed class AutofacMyType : MyType
{
    public AutofacMyType(IMyService s, ISomeDependency d)
        : this(s.DoSomething(), d) { }

    private AutofacMyType(Something p1, ISomeDependency d)
        : base(p1, d.DoSomething(p1, true)) { }
}