2016-08-05 24 views
2

私は若い開発者です。私はちょうど依存性注入を学習しています。? (静的クラスに対して)

私の例では、私はWCFサービスWeb(soap)を持っています。単純なビジネスアクションを実行し、データベースを呼び出します。

だから、私のプロジェクトは

サービスに切断される - >ビジネス・レイヤー - >レイヤーのデータアクセス - 私の場合>データベース

、ビジネス層内とでSELECTなステートメントà簡単なビジネスのアクションがありますデータアクセス層。要約すると

サービス層:

public void GetData() 
     { 
      BusinessLayer.GetData(); 
     } 

ビジネス層:

static class BusinessLayer 
    { 
     public static void GetData() 
     { 
      //If something or something else ... 
      DataAccessLayer.GetData(); 
     } 
    } 

は、だから今(確かに間違った方法)私は私の層の間の通信に静的クラスを使用しました

データアクセス層:

static class DataAccessLayer 
    { 
     public static void GetData() 
     { 
      //DO insert in database 
     } 
    } 

まず、これは悪い方法ですか?

次に、このような非常に単純なケースでは、IoCコンテナを設定する価値があるということですか?

ありがとうございます。

PS:申し訳ありません私の英語

+1

質問の前提は有効ではないようです。依存関係注入を行うためにIoCコンテナを必要としないので、静的クラスとIoCコンテナではありません。 –

+0

Imhoそれはあなたの会社が何をやっているのかによります。そして、彼らが開発の方向性をどのくらい速く変えるか)非常に単純なシナリオではIoCを使用できるケースがありますが、IoCがまったくオプションではないケースもあります。 –

+1

この質問はかなり広がりそうで、おそらく閉じられるでしょう。コンテナは気にする必要はありませんが、実際のクラスの設計については注意してください。 'static'では、通常、クラスの実際のインスタンスから独立して存在するものを言いますが、ビジネスレイヤーがデータアクセスレイヤーと1対1の関係にあると仮定します。それで、makie thjisすべてのインスタンスと完了です。 – HimBromBeere

答えて

0

私はあなたのレイヤークラスからインターフェイスを作成します。これにより、静的クラスが削除され、削除されます。あなたの例は、どちらかというと小さいですが、私は学習経験としてでなければ、問題を解決することをお勧めしません。この注入をいつ使うべきかについての厳しい規則はありませんが、ユニットテストが始まるとパターンは大いに役立ちます。

「ワウ!これは静的メソッドかシングルトンの場合に単体テストを書く方がずっと簡単でした!」

最後に、注入する機能のインターフェイスの線に沿って何かがあります。これは、あるレベルのドメインモデルが存在し、データベースからの生データがモデルに変換されることを前提としています。

あなたは、あなたが依存するクラスに注入しなければならない様々なインターフェースを定義することから始めます。

public interface IBusinessLayer 
{ 
    Data GetData(); 
} 

public interface IDataAccessLayer 
{ 
    Data GetData(); 
} 

public interface IDatabase 
{ 
    DbData GetDatabaseData(); 
} 

主な目標は、必要な操作を完了するためのコンセプトをコンテナに挿入することです。これで、データを取得します。データがドメインモデルのクラスであると仮定します。

public class ServiceLayer 
{ 
    IBusinessLayer business = null; 

    public ServiceLayer(IBusinessLayer business) 
    { 
     this.business = business; 
    } 

    public void GetData() 
    { 
     Data data = business.GetData(); 
     // do something with data 
    } 
} 

異なるレイヤーで同じパターンを繰り返すことができます。これは単純なアプリケーションのための多くの作業のように見えますが、インターフェイスによって与えられるハードエッジは、各レイヤーが独自に展開することを可能にします...インターフェイス契約が残っている限り。

レイヤーを明確に定義しておくと、分離がうまくいきます。たとえば、生のデータベース・データ、行などを上位層に取り込ませないことによって、

public class BusinessLayer:IBusinessLayer { IDataAccessLayer dataAccess = null;

// container will inject data access layer 
    public BusinessLayer(IDataAccessLayer dataAccess) 
    { 
     this.dataAccess = dataAccess; 
    } 

    public Data GetData() 
    { 
     Data data = dataAccess.GetData(); 
     // do something with data? 
     return data; 
    } 
} 

// Retruns typed data business layer 
public class DataAccessLayer : IDataAccessLayer 
{ 
    IDatabase db = null; 

    public DataAccessLayer(IDatabase db) 
    { 
     this.db = db; 
    } 

    public Data GetData() 
    { 
     var db_data = db.GetDatabaseData(); 
     Data data = /*convert raw db_data -> type domain data*/ 
     return data; 
    } 
} 
関連する問題