0

DALに依存するクラスがあります。

public class FirstClass()
{
    [Dependency]
    public IDalType Dal { get; set; }
}

次のコマンドでクラスのインスタンスを作成できます。

UnityContainer c = new UnityContainer();  
c.RegisterType<IDalType, DalType>();
FirstClass fc = c.Resolve<FirstClass>();

これにより依存関係が設定され、インスタンスを使用できます。これは、開始メインクラス(メインフォーム、メインViewModel)のようなものです。

今、私はSecondClass再びDAL依存関係を持っており、その2番目のクラスをインスタンス化して最初のクラスから呼び出す必要があります。それ、どうやったら出来るの?

public class FirstClass()
{
    [Dependency]
    public IDalType Dal { get; set; }

    public DoSomething()
    {
        ??? SecondClass sc = App.UnityContainer.Resolve<SecondClass>();
    }
}

最初のクラス内でUnityContainerを使用する場合、それはコンテナーとの結合になり、アプリケーションルートのどこかにIDAL-> DALをマップし、静的コンテナーを用意する必要があります。

コンテナとの結合が悪いこと、および静的マップを使用していることを読みました:http: //blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

4

2 に答える 2

1

FirstClassの依存関係としてSecondClassを追加します。

public class FirstClass
{
    [Dependency]
    public IDalType Dal { get; set; }

    [Dependency]
    public SecondClass Sc { get; set; }

    public DoSomething()
    {
        sc.DoWhatever();
    }
}

ただし、代わりにコンストラクタインジェクションに切り替えることを強くお勧めします。

public class FirstClass
{
    private IDalType dal;
    private SecondClass sc;

    public FirstClass(IDalType dal, SecondClass sc) 
    {
        this.dal = dal;
        this.sc = sc;
    }

    public DoSomething()
    {
        sc.DoWhatever();
    }
}

このように、属性を介してコンテナに結合されたり、入力としてのみ存在するプロパティを公開したりすることはなく(クラスのパブリックインターフェイスを混乱させる)、FirstClassのインスタンスを作成できないことを保証します。必要なすべての依存関係。

アップデート

オンデマンドでインスタンスを作成する必要がある場合は、代わりにFuncを注入できます。Unityは、呼び出されたときにコンテナにコールバックするファクトリメソッドを作成します。

public class FirstClass
{
    private IDalType dal;
    private Func<SecondClass> scFactory;

    public FirstClass(IDalType dal, Func<SecondClass> scFactory) 
    {
        this.dal = dal;
        this.scFactory = scFactory;
    }

    public DoSomething()
    {
        SecondClass cs = scFactory();
        sc.DoWhatever();
    }
}

どのヘルパーオブジェクトが何を実行するかを選択するためのより複雑な要件がある場合は、問題のオブジェクトをコンテナーから取得する必要があるかどうかを再評価します。代わりに、明示的なファクトリオブジェクトを挿入することを検討してください。

于 2012-06-11T16:54:09.817 に答える
1

ファクトリを使用するとSecondClass、コンシューマー内のサービス(の)のインスタンス化に関する知識が得られます。この投稿では、MarkSeemannが別のアプローチについて説明しています。

また、これらのタイプのアダプターのコーディングに時間と労力を費やしたくない場合は、CodePlexのTecXプロジェクトを参照してください。Unityを使用してオンザフライでレイジープロキシを生成するためのサポートが追加されます。

于 2012-06-12T00:00:17.873 に答える