重用autofac的查找逻辑

时间:2012-12-19 13:27:09

标签: autofac

Autofac在注册像这样的组件

时找到“最佳”ctor
builder.RegisterType<MyType>()...;
or
builder.RegisterType(typeof(MyType))...;

我正在寻找一种方法来重用Autofac的反射代码来查找ctor参数。这个逻辑在某些公共API中是否可用?

我想要的原因......

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

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的“查找逻辑”。

--- 结束编辑 ---

它运行正常但是,如果可能的话,我想使用autofac的逻辑来为我找到ctor依赖项。我想写点像

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

这是可能的还是我必须为此编写自己的逻辑?或者是一种完全不同的方法可用于这种情况?

1 个答案:

答案 0 :(得分:0)

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

更新:您可以使用Autofac.Core.Activators.Reflection命名空间中的IConstructorFinderIConstructorSelector接口,由PublicConstructorFinder和{分别为{1}}。