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

问题描述 投票:0回答:2

这是我的

dad
班级

 public class Dad
    {
        public string Name
        {
            get;set;
        }
        public Dad(string name)
        {
            Name = name;
        }
    }

这是我的测试方法

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

这是我遇到的错误

"InvalidOperationException - the type String cannot be constructed.
 You must configure the container to supply this value"

如何配置我的

DadContainer
才能通过此断言? 谢谢你

c# visual-studio-2010 dependency-injection inversion-of-control unity-container
2个回答
28
投票

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

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

    public Dad()
    {
    }

    public Dad(string name)
    {
        Name = name;
    }
}

如果无法提供无参数构造函数,则需要配置容器来提供它,或者直接将其注册到容器中:

UnityContainer DadContainer = new UnityContainer();
DadContainer.RegisterType<Dad>(
    new InjectionConstructor("chris"));

或通过 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>

0
投票

10 年后,我偶然发现了同样的挑战。 很多人问这个问题(或者关于 SO 的非常相似的问题),但答案很少,而且没有一个像我在 Unity 文档中找到的那样直接。

解决方案发现

我也有一个类需要在构造时传入一个字符串。

答案其实很简单,但有点令人困惑。

这是来自 UnityContainer.org 的答案 * 我进行了修改以引用 OP 的类(而不是文档使用的示例类)

Dad
是一个具有三个公共构造函数的简单类。什么时候 调用 Resolve(),Unity 将评估可用的构造函数 并选择一个可以满足依赖关系的参数列表最长的参数。它将创建所有必需的依赖项并传递它们 初始化期间选择的构造函数。

在这种特殊情况下,Unity 将选择 [可用] 构造函数 类型为

name
的参数
String
。然而,构造函数
Dad(string name)
具有类型
String
的参数,这是一个原始类型。 Unity 无法自行创建原始类型。如果你想让这些可用于依赖注入你需要 将它们注册到容器

// Register string instance
container.RegisterInstance("Frank");

// Resolve Dad
container.Resolve<Dad>(); 

就是这样! 🤯🤯

但是,我不确定如果您有多个带有需要字符串的构造函数的类型会发生什么。
你怎么知道哪个字符串将与哪个构造函数一起使用?

© www.soinside.com 2019 - 2024. All rights reserved.