2011-11-18 59 views
8
注入构造函数的参数

假设我们有一个类如何从配置文件中使用Unity

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

和的app.config(或web.config文件)

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

有没有办法登记MyClass类型的统一容器和点Unity来从配置文件中为val构造函数参数注入值?

+0

可能重复[在Unity配置中,如何将connectionString传递给构造函数?](http://stackoverflow.com/questions/4252231/ in-unity-config-how-to-pass-connectionstring-to-a-constructor) –

回答

6

这很容易。

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

在这个配置文件中,appSetting的引用在哪里被命名为“value”? – brentlightsey

+0

:“value”属性在这里。 –

+0

没有提及配置文件。那么如何映射配置文件或仅从? –

5

如果您使用XML配置,你可以通过定义一个处理的AppSettings作为统一的参数扩展为此,请参阅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并简化环境之间的迁移。

+0

为什么'RegisterType ()'注册类型函数指定了两个同名类的名字? – Mou

+0

最初的XML注册说类型,mapTo与两个相同的类型,所以我正在重现。对于流利的注册,你是正确的,你不需要第二个值;但通常情况下,您有RegisterType

3

很旧的文章,但我认为下面的信息可能是有帮助的情况下,它不是一个原始类型的值,而是一个复杂的数据类型来代替:

<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

相关问题