如何从Unity的配置文件中注入构造函数参数

本文关键字:注入 构造函数 参数 配置文件 Unity | 更新日期: 2023-09-27 18:15:13

假设我们有一个类

public class MyClass
{
    private string _val;
    public MyClass(string val) 
    {
         _val = val;
    }
}

和app.config(或web.config)

<appSettings>
    <add key="value" value="some value" />
</appSettings>

是否有办法在Unity容器中注册MyClass类型,并指出Unity从配置文件注入val构造函数参数的值?

如何从Unity的配置文件中注入构造函数参数

这很容易。

c#代码:

var container = new UnityContainer();
container.LoadConfiguration();
MyClass mc = container.Resolve<MyClass>();
配置文件:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">    
 <container>
  <register type="[namespace].MyClass, [assembly-name]" 
    mapTo="[namespace].MyClass, [assembly-name]">
    <constructor>
      <param name="val" value="Ethan Woo"/>
    </constructor>
  </register>
</container>

相当旧的帖子,但我认为以下信息可能是有帮助的,如果它不是一个本地类型的值,而是一个复杂的数据类型:

<configuration>
  <configsections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration">
    </section>
  </configsections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <alias alias="IRepository" type="UnityTest.IRepository, UnityTest">
      <alias alias="Repository" type="UnityTest.Repository, UnityTest">
        <container>
          <register mapto="Repository" type="IRepository">
            <register name="MyClass" type="UnityTest.MyClass, UnityTest">
              <constructor>
                <param name="repository" type="IRepository">
                <dependency name="IRepository">
                </dependency>
              </constructor>
            </register>
          </register>
        </container>
      </alias>
    </alias>
  </unity>
</configuration>

这里有更详细的描述:http://postlabs.blogspot.com/2015/05/injecting-non-native-data-type-via.html

如果你使用XML配置,你可以通过定义一个扩展来处理AppSettings作为Unity参数,参见http://www.neovolve.com/2010/04/23/appsetting-parameter-injection-in-unity-2/。

或者,如果你正在做c#配置,你可以使用注入构造函数,如下所示…

var container = new UnityContainer();
container.RegisterType<MyClass>(
    new InjectionConstructor(
       InjectionParameter<string>(ConfigurationManager.AppSettings["value"])));

使用AppSettings值而不是直接在XML配置中使用字符串的原因是,它将所有参数值集中到AppSettings中,并简化了环境之间的迁移。