这是我的
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
才能通过此断言?
谢谢你
您应该提供一个无参数构造函数:
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>
10 年后,我偶然发现了同样的挑战。 很多人问这个问题(或者关于 SO 的非常相似的问题),但答案很少,而且没有一个像我在 Unity 文档中找到的那样直接。
解决方案发现
我也有一个类需要在构造时传入一个字符串。
答案其实很简单,但有点令人困惑。
这是来自 UnityContainer.org 的答案 * 我进行了修改以引用 OP 的类(而不是文档使用的示例类)。
是一个具有三个公共构造函数的简单类。什么时候 调用 Resolve(),Unity 将评估可用的构造函数 并选择一个可以满足依赖关系的参数列表最长的参数。它将创建所有必需的依赖项并传递它们 初始化期间选择的构造函数。Dad
在这种特殊情况下,Unity 将选择 [可用] 构造函数 类型为
的参数name
。然而,构造函数String
具有类型Dad(string name)
的参数,这是一个原始类型。 Unity 无法自行创建原始类型。如果你想让这些可用于依赖注入你需要 将它们注册到容器。String
// Register string instance
container.RegisterInstance("Frank");
// Resolve Dad
container.Resolve<Dad>();
就是这样! 🤯🤯
但是,我不确定如果您有多个带有需要字符串的构造函数的类型会发生什么。
你怎么知道哪个字符串将与哪个构造函数一起使用?