Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Autofac是否允许指定应注入构造函数的依赖项类型_Autofac - Fatal编程技术网

Autofac是否允许指定应注入构造函数的依赖项类型

Autofac是否允许指定应注入构造函数的依赖项类型,autofac,Autofac,假设我有EmailService,它包含IEmailService。EmailService对ILogingService具有构造函数依赖性。现在,考虑到我有几个ILogingService的实现,我可以实现如下功能: <component service="IEmailService, MyInterfaces" type="EmailService, MyLib"> <parameters> <parameter name="loggingServi

假设我有EmailService,它包含IEmailService。EmailService对ILogingService具有构造函数依赖性。现在,考虑到我有几个ILogingService的实现,我可以实现如下功能:

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

我已经研究过为注册的类型命名,但到目前为止,还没有找到如何从XML配置中使用它们的示例

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

更多地针对80%的用例,而不是以XML形式完全实现Autofac的灵活性。用于配置。模块,再加上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);
  }
}
公共类电子邮件模块
{
受保护的覆盖无效负载(ContainerBuilder builder)
{
//注册一个命名的日志服务,以便我们可以找到
//这是一个具体的问题。
builder.RegisterType()
。名为(“电子邮件记录者”);
//创建可用于强制解析的ResolvedParameter
//将构造函数参数的值设置为命名的记录器类型。
var loggingServiceParameter=新解析的参数(
(pi,ctx)=>pi.Name==“loggingService”,
(pi,ctx)=>ctx.ResolveNamed(“emailLogger”);
//将ResolvedParameter添加到类型注册中,以便
//知道在解析时使用它。
builder.RegisterType()
.As()
.带参数(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>

当您想要切换配置时,请注册不同的模块,而不是摆弄特定的组件注册表


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

谢谢您的回答。我对此感到害怕,并希望找到一种方法,不必为每一个这样的情况编写模块。现在我将使用unity,因为它支持这种xml配置。