19

ユニティコンテナがそれ自体をオブジェクトに渡す方法はありますか?

すなわち:

public class Something {

     public Something(IUnityContainer container) {
           ...
     }
}
4

3 に答える 3

24

簡単な答えはイエスです。

これは、メソッドを使用するときに自動的に渡される必要があり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; }
}
于 2009-05-06T02:41:38.230 に答える
1

最初の答えは、私が考えていたようなものです。ありがとうございました。

Unityの前に、独自のIOCコンテナを構築しましたが、構文は次のようになります...

<constructor>
    <param name="factory" value="[{factory}]"/>
</constructor>

[{factory}]は、それ自体をパラメーターとして渡します。

静的として設定する場合:すべてのオブジェクトが(明らかに)単一のプロパティに依存するようになるため、このアプローチを使用するのは好きではありません。特に静的が読み取り専用である場合(そうあるべきです)、再利用性とテスト性が低くなります。スタティックが設定されると、それを台無しにすることはできません(またはできないはずです)。これにより、作成できるテストシナリオが制限されます。

他に何もない場合、オブジェクトは少なくともコンテナをパラメータとして受け入れることができるはずです。そこにない場合は、静的にフォールバックする可能性があります。

単一のインスタンスを使用する道をたどり、すべてを変更することになりました。私の意見では、オブジェクトはそれよりも柔軟でなければなりません。オブジェクトのコンシューマーが、オブジェクトに渡す単一のインスタンスを必要とする場合、それはコンシューマー次第です。しかし、オブジェクト自体はそれを必要とすべきではありません。上記の構文を使用すると、コンテナをグラフに渡すのが非常に簡単になります。

情報をありがとう。

ジェイ

すみません...新しい男。私は今、これは答えではなくコメントであるべきだったと思います。

于 2009-05-06T13:12:06.623 に答える
0

ベンデウィーが言ったように、それは他のオブジェクトと同じようにオブジェクトなので、あなたはそれを渡すことができますが、なぜそれを渡すのですか?

たった1つしかないのに、どのクラスもアクセスできる静的プロパティにしてみませんか?

于 2009-05-06T04:11:33.663 に答える