2

我正在尝试使用统一注册依赖项并将值传递给构造函数,使用下面的代码

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(new InjectionConstructor(new Pharmacy {SiteId = 2,DistrictCode = "2"}));

但我得到

“OrderService.Business.MockOrderServiceProviderContext 类型没有采用参数(药房)的构造函数。”

构造函数。

public MockOrderServiceProviderContext(params object[] objects)
     {
         _object = objects;
     }

你如何传递对象数组的构造函数值?

谢谢

4

3 回答 3

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" }
       }
    }));
于 2013-02-28T22:29:51.737 回答
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));
于 2013-02-27T16:40:50.450 回答
-1

如果我错了,请纠正我,但你不是想给你MockOrderServiceProviderContext的不是数组的参数吗?

new InjectionConstructor(..)改为作为参数给出,或者object如果您愿意这样说,而不是object[].

于 2013-02-27T15:36:53.100 回答