如何从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构造函数参数的值?
这很容易。
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中,并简化了环境之间的迁移。