2012-12-19 62 views
0

Autofac认为“最好”的构造函数。这种逻辑在某些公共API中可用吗?重用autofac的发现男星逻辑

我想以上的原因...

我有未知的类型在编译时(=动态代理)的一些组件。目前我注册他们这样

builder.Register(c => 
{ 
    var dep1 = c.Resolve<IFoo>(); 
    var dep2 = c.Resolve<IBar>(); 
    var dep3 = c.Resolve<IFooBar>(); 
    return someProxyFactory.CreateProxyFrom<MyType>(dep1, dep2, dep3); 
}...; 

--- 编辑 ---

如果没有代理参与,但是当无法使用RegisterType同样的问题是有效的。例如...

builder.Register(c => 
{ 
    [...] 
    if(something) 
    return new SomeType(dep1, dep2, dep3); 
    else 
    return new SomeOtherType(dep1, dep4, dep2, dep5); 
} 

这里我也想重用Autofac的“查找ctor逻辑”,如果可能的话。

--- 编辑完 ---

它工作正常,但是,如果可能的话,我想用autofac的逻辑找到构造函数依赖我。我想写点类似于

builder.Register(c => 
{ 
    object[] ctorDependencies = letAutofacDoTheSimilarWorkAsInRegisterType(typeof(MyType)); 
    return someProxyFactory.Create<MyType>(ctorDependencies); 
} 

这是可能的还是我必须写我自己的逻辑呢?或者,这种方案有一些完全不同的方法吗?

+0

为什么这些类型有多个公共构造函数呢?这意味着在选择它们之间存在不明确之处,并且在进行依赖注入时可以将其视为设计异味。确保每个组件都只有一个公共构造函数,问题就消失了。 – Steven

+0

为什么认为他们有多个公共机构?他们没有。我正在寻找一种让编译时instanciated类型未知的autofac也能找到依赖关系的方法。 – Roger

+0

我的歉意,我误解了你的问题。 – Steven

回答

0

不是你猜我之后的答案,但你可以使用the existing DynamicProxy2?这使您可以将拦截器附加到已注册的接口上,就像您使用代理工厂所做的一样。

更新:你可能使用在Autofac.Core.Activators.Reflection命名空间中的IConstructorFinderIConstructorSelector接口,分别由PublicConstructorFinderMostParametersConstructorSelector实施。

+0

谢谢,但在我的情况没有。代理是由另一个lib创建的。 – Roger

+0

我明白了。而这个库,你能不能提供一个预先构建的实例,而不是它需要做实例化? ...并且,你能告诉我们这个库是什么吗? –

+0

这是在另一个公寓开发的办公室内部的lib。 但我有点后悔我在问题中提到了“代理”......如果注册来自某种工厂的任何组件,也会出现相同的“问题”。 它今天正常工作,我只是认为重新使用Autofac的内部逻辑来查找ctor依赖关系会更好 - 我只是为它找到API。 – Roger