2016-03-24 5 views
2

複数のプロジェクト間で使用できる共有ファイルを作成する予定です。具体的なクラスをスワップする必要がある場合の依存性注入C#

マイプロジェクト:アイスクリームを食べるために

  1. コードを記述。 (アイスクリームは私の好きな食べ物なので)。 (私のお気に入りの食べ物は、将来マンゴに変わるかもしれませんのでご注意ください)
  2. マンゴーを食べるコードを書いてください。 (マンゴーは私の好きな食べ物なので)。 (私の好きな食べ物は、将来的にアイスクリームに変更される可能性がありますのでご注意ください)

次はインターフェース

interface IEatFavoriteFood 
{ 
    void eat(); 
} 

後は、私の具体的なクラスになりますです。私はeat()を呼び出すためにIEatFavoriteFoodインタフェースのための2つの異なる具象クラスを初期化されますので、

class EatMango 
{ 
    void eat() 
    { 
    // Some code to eat mango 
    } 
} 


class EatIceCream 
{ 
    void eat() 
    { 
    // Some code to eat ice cream 
    } 
} 

だから、私は、私の二つのプロジェクトのために、別々に二つの主要なプログラムを持っている必要があります。それに加えて

Main() 
{ 
    IEatFavoriteFood iff = new EatMango(); 
    iff.eat(); 
} 

Main() 
{ 
    IEatFavoriteFood iff = new EatIceCream(); 
    iff.eat(); 
} 

、いつか将来的には最初のプロジェクトではマンゴーの好きな食べ物の変更は、その後、私は再書き込み初期化して再コンパイルする必要があります場合は私のプロジェクト。この機能を実装するには、より良い方法がありますか?この場合、設定ファイルを使用するのが良いでしょうか?

答えて

4

依存性注入が機能するには、具体的な型がリストされている場所が必要です。これは、可能な依存関係(インタフェース)のためにどの具体的なクラスをプラグインするかを知っています。

依存性注入フレームワークでは、これはコードや外部ファイル(たとえばXMLの設定など)の設定によって行われることがよくあります。

あなたの目的のために、それはおそらく、簡単に始まり、単にあなたの依存関係を提供するいくつかの "中央エンティティ"を持っている最も簡単な方法です。これは、例えばFavoriteFoodFactory次のようになります。

public class FavoriteFoodFactory 
{ 
    public static IEatFavoriteFood GetFavoriteFood() 
    { 
     return new EatIceCream(); 
    } 
} 

だからあなたMainに、あなたはただ好きな食べ物は、現在設定されているものは何でもあなたを与えるためにその工場を尋ね:もちろん

Main() 
{ 
    IEatFavoriteFood iff = FavoriteFoodFactory.GetFavoriteFood(); 
    iff.eat(); 
} 

を単にシフトしています具体的なオブジェクトを他の場所に作成する責任がありますが、それはまさに依存性注入のポイントです。一番上に依存関係を解決する方法を取り入れるには、を削除すると、コンポーネントよりさらに下にあるを知る必要があります。

2

Autofac(http://autofac.org/)、Ninject(http://www.ninject.org/)などのIOCコンテナを使用することをお勧めします。 コンテナは、そのようなシナリオを処理するさまざまな方法を提供します。 たとえば、Autofacでは、web.configまたはコードを使用してロードまたは選択できるモジュール(コンテナで使用される具象クラスの登録を含むクラス)を作成できます。 あなたが例http://docs.autofac.org/en/latest/configuration/modules.html

IOCコンテナを使用して簡単にすることができますので、予めご了承ください とここに詳細なマニュアルを参照してくださいすることができますが、ほとんどの場合、あなたは可能性のある問題とメモリリークを避けるために、コンポーネントのライフサイクルを意識する必要があります。