ユニティコンテナは、自身の参照をコンストラクタパラメータとして渡すことができますか?
-
06-07-2019 - |
質問
単一のコンテナがオブジェクトに自身を渡す方法はありますか?
i.e。:
public class Something {
public Something(IUnityContainer container) {
...
}
}
解決
短い答えはイエスです。
これは、 Resolve
メソッドを使用するときに自動的に渡されます。
例:
IUnityContainer container = new UnityContainer();
var something = container.Resolve<Something>();
さらに、これは、Prism(CodePlexで)を使用したい場合に使用するのと同じテクニックです。
追加されたテストの更新:
[TestClass]
public class Spike
{
[TestMethod]
public void unityTest()
{
var container = new UnityContainer();
var something= container.Resolve<Something>();
Assert.AreSame(container, something.Container);
// This passes. Success.
}
}
public class Something
{
public Something(IUnityContainer container)
{
Container = container;
}
public IUnityContainer Container { get; set; }
}
他のヒント
最初の答えは、私が考えていたようなものです。ありがとう。
Unityの前に、独自のIOCコンテナを作成しました。次のような構文があります...
<constructor>
<param name="factory" value="[{factory}]"/>
</constructor>
[{factory}]により、パラメータとして自身が渡されます。
静的として設定する場合:すべてのオブジェクトが単一のプロパティに依存するようになるため、このアプローチを使用するのは好きではありません(明らかに)。特に静的が読み取り専用(あるべき)の場合、再利用性とテスト性が低下します。静的が設定されると、それを混乱させることはできません(またはできないはずです)。これにより、作成できるテストシナリオが制限されます。
他に何もなければ、オブジェクトは少なくともパラメータとしてコンテナを受け入れることができるはずです。存在しない場合は、静的にフォールバックする可能性があります。
単一のインスタンスを使用する道を進み、最終的にすべてを変更しました。私の意見では、オブジェクトはそれよりも柔軟でなければなりません。オブジェクトのコンシューマーがそのオブジェクトに渡す単一のインスタンスを必要とする場合、それはコンシューマー次第です。しかし、オブジェクト自体はそれを必要とすべきではありません。上記の構文を使用すると、コンテナをグラフに簡単に渡すことができます。
情報をありがとう。
ジェイ
ごめん...新しい男。答えではなくコメントであるはずです。
bendeweyが述べたように、他のオブジェクトと同様にオブジェクトなので、渡すことができますが、なぜ渡すのですか?
1つしかありません。どのクラスからもアクセスできる静的プロパティにしないでください。