如何配置unity容器来提供字符串构造函数值?

iAt*_*_it 17 c# dependency-injection inversion-of-control unity-container visual-studio-2010

这是我的dad班级

 public class Dad
    {
        public string Name
        {
            get;set;
        }
        public Dad(string name)
        {
            Name = name;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的测试方法

public void TestDad()
        {
           UnityContainer DadContainer= new UnityContainer();
           Dad newdad = DadContainer.Resolve<Dad>();    
           newdad.Name = "chris";    
           Assert.AreEqual(newdad.Name,"chris");                 
        }
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误

"InvalidOperationException - the type String cannot be constructed.
 You must configure the container to supply this value"
Run Code Online (Sandbox Code Playgroud)

如何配置我DadContainer的断言传递?谢谢

p.s*_*w.g 28

你应该提供一个无参数的构造函数:

public class Dad
{
    public string Name { get; set; }

    public Dad()
    {
    }

    public Dad(string name)
    {
        Name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不能提供无参数构造函数,则需要通过直接将其注册到容器来配置容器以提供它:

UnityContainer DadContainer = new UnityContainer();
DadContainer.RegisterType<Dad>(
    new InjectionConstructor("chris"));
Run Code Online (Sandbox Code Playgroud)

或者通过app/web.config文件:

<configSections>
  <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>

<unity>
  <containers>
    <container>
      <register type="System.String, MyProject">
        <constructor>
          <param name="name" value="chris" />
        </constructor>
      </register >
    </container>
  </containers>
</unity>
Run Code Online (Sandbox Code Playgroud)

  • 你绝对可以使用`InjectionConstructor`来提供名称.但是,对于所有`Dad`实例,它总是使用相同的名称.如果你想要一个不同的值,你可以使用ResolverOverride:`DadContainer.Resolve <Dad>(new ParameterOverride("name",nameOfDad));` (10认同)