Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Unity从配置文件中插入构造函数参数_C#_.net_Dependency Injection_Unity Container - Fatal编程技术网

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"])));