[英]Unity - Why isn't Resolve(ParameterOverride[]) using the expected constructor?
我想将 IoD 与实现接口并具有带参数的构造函数的 class 一起使用。
界面:
public interface IUsefulClass
{
string InterestingInfo { get; set; }
string RelevantStuff { get; set; }
}
两个简单的属性,没什么好说的。
class:
public class UsefulClass : IUsefulClass
{
public string InterestingInfo { get; set; }
public string RelevantStuff { get; set; }
public UsefulClass()
{
}
public UsefulClass(string p_strInterestingInfo)
{
InterestingInfo = p_strInterestingInfo;
}
public UsefulClass (string p_strInterestingInfo, string p_strRelevantStuff)
{
InterestingInfo = p_strInterestingInfo;
RelevantStuff = p_strRelevantStuff;
}
}
它有几个不同的构造函数,每个构造函数都以自己的方式设置属性。
来自另一个 class 的调用:
public void HereGoes()
{
IUnityContainer z_ucoContainer = new UnityContainer();
z_ucoContainer.RegisterType<IUsefulClass, UsefulClass>();
IUsefulClass z_objUsefulButEmpty = z_ucoContainer.Resolve<IUsefulClass>();
IUsefulClass z_objUsefulAndInteresting = z_ucoContainer.Resolve<IUsefulClass>(new ParameterOverride("p_strInterestingInfo", "This is interesting information"));
IUsefulClass z_objUsefulAndInterestingToo = z_ucoContainer.Resolve<IUsefulClass>(new ParameterOverride[] { new ParameterOverride("p_strInterestingInfo", "This is very interesting information") });
IUsefulClass z_objUsefulInterestingAndRelevant = z_ucoContainer.Resolve<IUsefulClass>(new ParameterOverride("p_strInterestingInfo", "This is quite interesting information"), new ParameterOverride("p_strRelevantStuff", "More relevant stuff here"));
IUsefulClass z_objUsefulInterestingAndRelevantAsWell = z_ucoContainer.Resolve<IUsefulClass>(new ParameterOverride[] { new ParameterOverride("p_strInterestingInfo", "This is possibly the most interesting information"), new ParameterOverride("p_strRelevantStuff", "Look for relevant stuff there") });
}
在测试和调试中,我发现所有五个变量在两个属性中都有null
。
再调试一些,结果发现每个Resolve()
都调用了无参数构造函数。
我尝试删除所述构造函数(当然还有设置z_objUsefulButEmpty
的代码行):我收到 Unity.ResolutionFailedException 消息,“解决失败并出现错误:未能 select 是 RegMat_VM.Infrastructure.UsefulClass 的构造函数”。
我看了又看,但找不到我做错了什么。 我怎样才能让它正常工作?
请参考我的代码,我将向您展示它们的用法。
using System;
using System.Collections.Generic;
using Unity;
namespace ConsoleApp1 {
class Program {
static void Main (string[] args) {
IUnityContainer container = new UnityContainer();
container.RegisterType<IPeople, Swordsman>();//Unnamed default registration, the following default registration will overwrite the previous one
container.RegisterType<IPeople, Witch>("Witch");//Named registration
IPeople people=container.Resolve<IPeople>();//Resolve default objects
IPeople _witch =container.Resolve<IPeople>("Witch");//Specify the name resolution object
IEnumerable<IPeople> peoples=container.ResolveAll<IPeople>();//Get all registered named objects of IPeople in the container
people.ClassName = people.GetType().ToString();
_witch.ClassName = _witch.GetType().ToString();
var info1= people.ShowInfo();
var info2= _witch.ShowInfo();
foreach (var item in peoples)
{
item.ClassName = item.GetType().ToString();
Console.WriteLine(item.ShowInfo());
}
Console.WriteLine(info1);
Console.WriteLine(info2);
Console.ReadLine();
}
}
//People interface
public interface IPeople {
string ClassName {
get; set;
}
string ShowInfo ();
}
//Witch
public class Witch : IPeople {
public string ClassName {
get; set;
}
public string ShowInfo () {
return string.Format("Witch:{0}", ClassName);
}
}
//Swordsman
public class Swordsman : IPeople {
public string ClassName {
get; set;
}
public string ShowInfo () {
return string.Format("Swordsman:{0}", ClassName);
}
}
}
Output:
仔细参考它们的用法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.