我正在尝试使用unity注册依赖项并使用下面的代码将值传递给构造函数
container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(new InjectionConstructor(new Pharmacy {SiteId = 2,DistrictCode = "2"}));
但我正在
“OrderService.Business.MockOrderServiceProviderContext类型 没有带参数的构造函数(Pharmacy)。“
构造。
public MockOrderServiceProviderContext(params object[] objects)
{
_object = objects;
}
如何传递对象数组的构造函数值?
谢谢
答案 0 :(得分:5)
params关键字是用于传递参数数组的语法糖。
以下方法:
public void MyMethod(params object[] args)
{
}
可以使用以下两种方式调用相同的结果:
MyMethod(new object(), new object());
MyMethod(new []{ new object(), new object());
当Unity查找构造函数时,它会看到一个构造函数,其中一个参数类型为object[]
。所以Unity提供的值必须是一个数组。
InjectionConstructor
也使用params关键字,其中每个参数都是一个转发给您自己的构造函数的值。如果使用数组实例化InjectionConstructor
,它将尝试使用数组的每个元素并将它们转发给类构造函数。
为了阻止这种情况,我们需要两个级别的包装,一个用于统一,为您的类提供一个数组,另一个用于InjectionConstructor
使用第一个数组作为第一个也是唯一的参数。
所以你应该使用以下内容:
container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(
new InjectionConstructor(new []
{
new []
{
new Pharmacy { SiteId = 2, DistrictCode = "2" }
}
}));
如果您想要传递其他项目,只需将它们添加到内部数组:
container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(
new InjectionConstructor(new []
{
new []
{
new Pharmacy { SiteId = 2, DistrictCode = "2" },
new Hospital { SiteId = 5, DistrictCode="2" }
}
}));
答案 1 :(得分:2)
这就是我的工作方式。
您必须将对象添加到数组中,然后将它们添加到容器数组中,以便它与构造函数参数签名匹配
var objAr = new object[2];
objAr[0] = new Pharmacy { SiteId = 3, DistrictCode = "2" };
objAr[1] = new Facility { SiteID = 1, FacilityCode="Facility" };
//Add the object array to another container array so that Unity Injection constructor can match the constructor.
var containerArray = new object[1];
containerArray[0] = objAr;
container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(new InjectionConstructor(containerArray));
答案 2 :(得分:-1)
如果我错了,请纠正我,但是你没有尝试给你的MockOrderServiceProviderContext
不是一个数组的参数吗?
您将new InjectionConstructor(..)
替换为参数,或object
如果您愿意这样做,而不是object[]
。