C# 如何使用Unity从配置文件中插入构造函数参数
假设我们有一节课C# 如何使用Unity从配置文件中插入构造函数参数,c#,.net,dependency-injection,unity-container,C#,.net,Dependency Injection,Unity Container,假设我们有一节课 public class MyClass { private string _val; public MyClass(string val) { _val = val; } } 和app.config(或web.config) 有没有办法在Unity容器中注册MyClass类型,并指向Unity为配置文件中的val构造函数参数注入值?这很简单 C#代码: var container=newunitycontainer()
public class MyClass
{
private string _val;
public MyClass(string val)
{
_val = val;
}
}
和app.config(或web.config)
有没有办法在Unity容器中注册MyClass类型,并指向Unity为配置文件中的val构造函数参数注入值?这很简单
C#代码:
var container=newunitycontainer();
container.LoadConfiguration();
MyClass mc=container.Resolve();
配置文件:
<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>
如果您使用的是XML配置,则可以通过定义一个扩展来实现,该扩展将AppSettings处理为Unity参数,请参阅 或者,如果您正在进行C#配置,您可以使用注入构造函数,如下所示
var container = new UnityContainer();
container.RegisterType<MyClass>(
new InjectionConstructor(
InjectionParameter<string>(ConfigurationManager.AppSettings["value"])));
var container=newunitycontainer();
container.RegisterType(
新注入构造函数(
InjectionParameter(ConfigurationManager.AppSettings[“值”]);
在XML配置中直接使用AppSettings值而不是字符串的原因是它将所有参数值集中到AppSettings中,并简化了环境之间的迁移。这是一篇很老的文章,但我认为如果它不是本机类型的值,而是复杂类型的值,那么下面的信息可能会有所帮助数据类型改为:
此配置文件中名为“value”的appSetting引用的位置可能重复:此处为“value”属性。没有对配置文件的引用。那么如何映射配置文件或仅从中映射?“配置文件”在这里表示win/console应用程序的app.config,以及iis托管应用程序的web.config,例如web、wcf。。。container.LoadConfiguration();将相应地自动加载配置。您不回答此问题。这个答案涉及从web.config到Unity构造函数的键/值,而不是如何在web.config中定义Unity构造函数。为什么RegisterType()
register type函数指定同一类的两个名称?原始的XML注册显示type,mapTo,两者的类型相同,所以我复制了它。对于流畅的注册,您是正确的,您不需要第二个值;通常情况下,您拥有RegisterType
<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>
var container = new UnityContainer();
container.RegisterType<MyClass>(
new InjectionConstructor(
InjectionParameter<string>(ConfigurationManager.AppSettings["value"])));