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

时间:2011-11-18 19:48:23

标签: c# .net dependency-injection unity-container

想象一下,我们有一个班级

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构造函数参数注入值?

3 个答案:

答案 0 :(得分:9)

这很容易。

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>

答案 1 :(得分:5)

如果您使用的是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"])));

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

答案 2 :(得分:5)

相当旧的帖子,但我认为以下信息可能会有所帮助,以防它不是本机类型的值而是复杂的数据类型:

<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