Autofac是否允许指定应将哪些依赖类型注入构造函数

时间:2012-05-17 12:00:03

标签: autofac

让我们说我有EmailService来支持IEmailService。并且EmailService对ILoggingService具有构造函数依赖性。既然我有几个ILoggingService的实现,可以实现这样的事情:

<component service="IEmailService, MyInterfaces" type="EmailService, MyLib">
  <parameters>
    <parameter name="loggingService" value="LoggingService, MyLib" />
  </parameters>
</component>

我已经考虑过给已注册类型命名,但到目前为止找不到如何从XML配置中使用它们的示例。

简而言之,我想使用XML配置来指定注入哪个具体的记录器实现。

1 个答案:

答案 0 :(得分:3)

XML configuration in Autofac更多地针对80%的用例,而不是完全实现Autofac在XML格式中的灵活性。 Autofac instead recommends using its module mechanism用于配置。模块与XML配置相结合,可以成为实现您希望实现的目标的一种非常强大的方式,并且仍然具有根据需要在依赖关系之间切换的灵活性。

首先,创建一个执行所需注册的Autofac模块:

public class EmailModule
{
  protected override void Load(ContainerBuilder builder)
  {
    // Register a named logging service so we can locate
    // this specific one later.
    builder.RegisterType<LoggingService>()
           .Named<ILoggingService>("emailLogger");

    // Create a ResolvedParameter we can use to force resolution
    // of the constructor parameter to the named logger type.
    var loggingServiceParameter = new ResolvedParameter(
      (pi, ctx) => pi.Name == "loggingService",
      (pi, ctx) => ctx.ResolveNamed<ILoggingService>("emailLogger"));

    // Add the ResolvedParameter to the type registration so it
    // knows to use it when resolving.
    builder.RegisterType<EmailService>()
           .As<IEmailService>()
           .WithParameter(loggingServiceParameter);
  }
}

请注意,注册要复杂得多,因为您需要非常具体的解决方案。

现在在XML配置中,注册该模块:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section
      name="autofac"
      type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
  </configSections>
  <autofac>
    <modules>
      <module type="EmailModule, MyAssembly" />
    </modules>
  </autofac>
</configuration>

如果要切换配置,请注册其他模块,而不是摆弄特定的组件注册表。

代码免责声明:我正在从内存中编写语法而且我不是编译器,所以你可能需要做一些调整 ......但前提是这样。 隔离模块中的复杂性,然后注册模块。