想象一下,我们有一个班级
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构造函数参数注入值?
答案 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