0

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

---结束编辑---

它工作正常,但如果可能的话,我想使用 autofac 的逻辑来为我找到 ctor 依赖项。我想写类似的东西

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

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

4

1 回答 1

0

我猜这不是您想要的答案,但是您可以使用现有的 DynamicProxy2吗?这使您能够将拦截器附加到已注册的接口,就像您使用代理工厂所做的一样。

更新:您可以使用Autofac.Core.Activators.Reflection 命名空间中的IConstructorFinder和接口,分别由和实现。IConstructorSelectorPublicConstructorFinderMostParametersConstructorSelector

于 2012-12-20T08:11:27.097 回答