2

以下のコードを使用して、ユニティを使用して依存関係を登録し、値をコンストラクターに渡そうとしています

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

しかし、私は得ています

「タイプ OrderService.Business.MockOrderServiceProviderContext には、パラメーターを受け取るコンストラクターがありません (Pharmacy)。」

コンストラクタ。

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 がコンストラクターを探すとき、 type の 1 つのパラメーターを持つコンストラクターを見つけますobject[]。したがって、Unity が提供する値は配列でなければなりません。

またInjectionConstructor、params キーワードも使用します。各パラメーターは、独自のコンストラクターに転送する値です。を配列でインスタンス化するInjectionConstructorと、配列の各要素を使用してクラス コンストラクターに転送しようとします。

これを止めるには、2 つのレベルのラッピングが必要です。1 つは Unity がクラスに配列を提供するためのもので、もう 1 つ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 に答える