Unity InjectionConstructor传递对象数组

JoR*_*JoR 2 dependency-injection unity-container

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

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

但我越来越

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

构造函数。

public MockOrderServiceProviderContext(params object[] objects)
     {
         _object = objects;
     }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Luk*_*oid 5

params关键字是用于传递参数数组的语法糖。

方法如下:

public void MyMethod(params object[] args)
{
}
Run Code Online (Sandbox Code Playgroud)

可以通过以下两种方式调用,结果相同:

MyMethod(new object(), new object());
MyMethod(new []{ new object(), new object());
Run Code Online (Sandbox Code Playgroud)

当Unity查找构造函数时,它会看到一个带有一个type类型参数的构造函数object[]。因此,Unity提供的值必须是一个数组。

InjectionConstructor还利用关键字参数,可以每个参数的值,以转发给自己的构造函数。如果InjectionConstructor使用数组实例化,它将尝试使用数组的每个元素并将它们转发给您的类构造函数。

要停止这种情况,我们需要两个包装级别,一个包装是为了统一为您的类提供一个数组,另一个包装是InjectionConstructor将第一个数组用作第一个也是唯一的参数。

因此,您应该使用以下内容:

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(
    new InjectionConstructor(new []
    {
       new []
       {
           new Pharmacy { SiteId = 2, DistrictCode = "2" }
       }
    }));
Run Code Online (Sandbox Code Playgroud)

如果要传递其他项目,只需将它们添加到内部数组中即可:

container.RegisterType<IProviderContext, MockOrderServiceProviderContext>(
    new InjectionConstructor(new []
    {
       new []
       {
           new Pharmacy { SiteId = 2, DistrictCode = "2" },
           new Hospital { SiteId = 5, DistrictCode="2" }
       }
    }));
Run Code Online (Sandbox Code Playgroud)