ユニティコンテナ自体をオブジェクトに渡す方法はありますか?ユニティコンテナはコンストラクタパラメータとして自身の参照を渡すことはできますか?
すなわち:
public class Something {
public Something(IUnityContainer container) {
...
}
}
ユニティコンテナ自体をオブジェクトに渡す方法はありますか?ユニティコンテナはコンストラクタパラメータとして自身の参照を渡すことはできますか?
すなわち:
public class Something {
public Something(IUnityContainer container) {
...
}
}
短い答えはイエスです。
Resolve
メソッドを使用すると、これは自動的に渡されます。例えば
は:
IUnityContainer container = new UnityContainer();
var something = container.Resolve<Something>();
また、これはあなたがそれに見たい場合(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; }
}
bendeweyあなたはそれは、オブジェクトが他のオブジェクトと同様、であるとして、それを渡すことができますが、前述のように、なぜそれを渡しますか?
あなたは1つしか持っていないので、どのクラスでもアクセスできる静的なプロパティにならないのはなぜですか?
私はこのアプローチで懸念しているのは、静的クラスを含むプロジェクトに不必要な依存関係を引き起こす可能性があるということです。私の経験では、コンテナを注入することもテストに役立ちます。 – bendewey
静的アクセサが他の依存関係に使用されないのと同じ理由で、テスト容易性が複雑になります。 –
コンテナを取得するためのユニットテストフレームワークにロジックを持たせるのではなく、そのクラスをテストできるように、コンテナを扱う別のクラスを持つ方がよいでしょう。あなたは今それが適切に動作することを知っているので、あなたの単体テストはテストされていないものを使用していません。単体テストでは、テストする必要があるので、私は非常に少数のユーティリティ関数を持つようにしています。 –
最初の答えは、私が考えていたもののようなものです。ありがとうございました。
はユニティに先立ち、我々は我々自身のIOCコンテナを構築し、そして我々は、構文何かのよう...
<constructor>
<param name="factory" value="[{factory}]"/>
</constructor>
[{工場は}]それは、パラメータとしての地位を渡すために原因を持っています。
静的に設定する方法:すべてのオブジェクトが単一のプロパティ(明らかに)に依存するため、この方法を使用するのは嫌いです。その再利用性は低く、テスト可能ではありません。特に静的が読み込み専用である場合(それは必然的です)。スタティックが設定されると、それを混乱させることはできません(また、できなくてはなりません)。これにより、作成できるテストシナリオが制限されます。
他に何もなければ、オブジェクトは少なくともパラメータとしてコンテナを受け入れることができます。それがなければ、それは静的に落ちる可能性があります。
私たちは1つのインスタンスを使用する道を踏み出し、すべてを変更しました。私の意見では、オブジェクトはそれより柔軟でなければなりません。オブジェクトのコンシューマがオブジェクトに渡す単一のインスタンスを持つことを望む場合、それはコンシューマの責任です。しかし、オブジェクトそのものはそれを必要とすべきではありません。上記の構文では、グラフを介してコンテナを渡すのが本当に簡単です。
ありがとうございました。
ジェイ
申し訳ありません...新しい男。私は今これがコメントであったはずで、答えではないはずです。
これは、元の質問の更新として表現されている可能性もあります。また、投票は文脈から「最初の答え」のコメントを取ることができます。 – bendewey
コンテナを登録する必要はありません。デフォルトではIUnityContainerの依存関係が解決されます。 –
私は昨晩、それを指摘してくれたスパイクを実行する時間がなかった。私が使用したテストを追加しました。 – bendewey