2011-08-23 47 views
1

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); 
        }); 
+0

你希望Autofac调用该委托,并在该调用中注入'IMyService'和'ISomeDependency'? – Steven

+0

@Steven:正是 –

回答

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)) { } 
} 
+0

这就是我现在使用的,我不喜欢它,因为我必须自己解决依赖关系... –

+0

第二个是一个好主意,但它只会工作,如果逻辑创建实例相当简单。 –

+0

只要代码位于组合根(而不是应用程序中)内,我个人认为没有问题调用'container.Resolve',但如果要使用自动(构造函数)注入,则可以创建一个“MyType”子类(在Composition Root内),它取得两个依赖关系;看到我的更新。 – Steven