【问题标题】:C# Unity container Ctor injectionC# Unity容器Ctor注入
【发布时间】:2011-10-12 14:20:18
【问题描述】:

假设我们有:

class A
{
   ILogger myLog;
   A(ILogger log)
   {
      this.myLog = log;
   }
 ...
}

并且我们之前已经在unity容器中注册了ILogger接口,例如

 container.RegisterType<ILogger, SomeLogger>();

这里是 SomeLogger 类:

class SomeLogger : ILogger
{
   string myString;
   SomeLogger(string test)
   {
     myString = test;
   }
 ...
}

现在,unity 如何在不将字符串传递给 SomeLogger 的 ctor 的情况下为 A 类创建 SomeLogger 的实例? 假设 SomeLogger 没有其他 ctor。在哪里可以为映射的 SomeLogger 类型的 ctor 指定参数?

【问题讨论】:

    标签: c# mapping unity-container containers


    【解决方案1】:

    您可以在配置中这样做:

    <?xml version="1.0"?>
    <configuration>
        <configSections>
            <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
        </configSections>
        <unity>
            <containers>
                <container>
                    <types>
                        <type type="[Namespace].ILogger, [AssemblyName]" mapTo="[Namespace].SomeLogger, [AssemblyName]">
                            <constructor>
                                <param name="test">
                                    <value value="MyDesiredValue" />
                                </param>
                            </constructor>
                        </type>
                    </types>
                </container>
            </containers>
      </unity>
    </configuration>
    

    这也以声明方式注册您的类型,所以

    container.RegisterType<ILogger, SomeLogger>();
    

    不再需要调用。

    -道格

    【讨论】:

    • 感谢这个例子。如何在代码中指定 this?文档只讨论了注入类型的 ctor 参数,而不涉及接口的映射类型。
    【解决方案2】:

    你可以这样做:

    container.RegisterType<ILogger, SomeLogger>(new InjectionConstructor("myStringValue"));
    

    【讨论】:

      【解决方案3】:

      您也可以在注册码中进行如下操作:

      UnityContainer.RegisterType<ILogger, SomeLogger>();
      UnityContainer.Configure<InjectedMembers>()
                    .ConfigureInjectionFor<SomeLogger>(new InjectionConstructor("TestString"));
      

      【讨论】:

      • 非常感谢,这正是我想要的。在我的具体问题中,我有一个 WFC 回调类,并且 WCF 客户端 ctor 需要一个实例上下文。到目前为止,我还不知道如何将此实例上下文传递给统一容器以用于 WCF 客户端的映射。
      • RegisterType 有一个重载,它接受一个参数 InjectionMember[],您可以使用它直接传递 InjectionConstrutor。无需单独调用configure。
      • 如果不提供统一容器的字符串参数会怎样?运行时异常?
      • @Juergen 我不知道,我会假设 null 传递给可空类型?我得测试一下..
      猜你喜欢
      • 2011-03-08
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多