2017-01-03 1 views
1

1つの大きなシステム内に複数のサブシステムがあります。したがって、すべてのサブシステムには独自のBALおよびDAL実装があります。今度はBALが重要なロジックを持っていますが、DALは基本的に同様のコードを持っていましたので、私はこれをすべてのサブシステムで使用される汎用のDALクラスにリファクタリングしました。このような何か:共通コードを持つ複数のクラスの実装をリファクタリングする(DIの場合)

のは、AとBとのサブシステム名を想定してみましょう

public class DalA 
{ 
    private IGenericDal genericDal; 

    public DalA(IGenericDal injectedGenericDal) 
    { 
     this.genericDal = injectedGenericDal; 
    } 

    public bool DoSomeDBWorkForA() 
    { 
     return genericDal.CommonDalMethod(); 
    } 
} 


public class DalB 
{ 
    private IGenericDal genericDal; 

    public DalB(IGenericDal injectedGenericDal) 
    { 
     this.genericDal = injectedGenericDal; 
    } 

    public bool DoSomeDBWorkForB() 
    { 
     return genericDal.CommonDalMethod(); 
    } 
} 

今の一般的なDALを注入するDI部分は、ビューのユニットテストの点から重要であり、そのBAL(複数可)を注入しなければなりませんジェネリックDALオブジェクト。したがって、BALは、リファクタリングとDIの要件のために、一般的なDALオブジェクトを不必要に認識しています。これは理想的には(特にリファクタリングの場合)は理想的ではありません。

また、私の友人の一人は、サブシステムAとBのDALが何もしていないと指摘しているので、おそらくそれらを取り除き、一般的なDAL自体を呼び出すべきですが、私の意見では、 AはBやCが購読していないいくつかのログや他の特別なアクションをしたいかもしれません。

あなたはどう思いますか? DIの問題(AのBALはAのDALのみを認識し、一般的なDALオブジェクトは認識しません)と柔軟性(すべてのサブシステムに異なるDALを持つ)が損なわれない、より良いリファクタリングされた実装を持っていますか?

私が考えた方法の1つは、AALとBのDALに2つのコンストラクタを持つことでした.BALから汎用DALを注入せずに呼び出すことができ、Unit Testから汎用DALオブジェクトを注入できます。

+2

IMHO、これは、1つのシステム(ソリューション)これらのシステムのすべての部分を持っている内部の複数のサブシステムを持つことが間違っているのです。サブシステムをモジュールに変更するか、マイクロサービスを使用する方が良い考えです)。 –

+0

@ shA.tこれは良い提案ですが、この場合、マイクロサービス実装のためにレイテンシを増やす余裕がありません;その場合は何をお勧めしますか? –

答えて

1

サブシステムAとBのDALは何もしていないので、おそらくそれらを取り除き、汎用DAL自体を呼び出すべきですが、私の意見では、明日のDALはAロギング、あるいはBやCが購読していないかもしれない他の特別なアクション。

クラスはopen for extension but closed to modificationである必要があります。つまり、ロギングを追加すると、AのDALを変更する必要があるわけではありません。これは、汎用DALをラップするデコレータを作成することで可能になります。他のクロスカッティングに関する懸念も同様です。 。

ので、この柔軟性がIMOに間接の余分な層を維持するための強力な引数ではありません

+0

あなたは当分の間、中間のDALを取り除くことが行くべき方法であり、変更はDecoratorを介して処理されるべきだと言いますが、世界中のDALが多量のロジックを扱うことはめったにないと思いません大部分のアプリケーションは対処するために複数のモジュール(したがって複数のDAL(s))を持つので、DAL(複数可)は常にこのように設計されるべきではありませんか? –

+1

@RachitPandey:はい、提供された情報を考慮して、中間層の削除をアドバイスします。私は実際には、これとあまりにも多くの共通の味があるので、 "世界中のDAL"がどのように設計されているかについてはコメントできません。 – Steven

+0

今は中間層の削除に同意しますが、私はあなたの考えを尊重したい1つの異常があります。 BALから直接汎用DALを呼び出す場合は、SP名などの「DAL固有のパラメータ」を提供する必要があります。これは、BALが実際に認識すべきではないと思います。また、一般的なDALからこれらのパラメータを削除してGenericのままにすることはできません。 –

関連する問題