2017-01-13 9 views
1

上司、最近私に彼は私が構築していますN階層MVCアプリケーションに組み込むために望んでいるいくつかのC#.NETコードを与えました。彼は私に不足しているコードを記入したいと思う。ここでは中間層のクラスファイル(下図参照)のC# - (実装していない)のインスタンスを宣言するための理由インターフェース

public class UnitOfWork : IUnitOfWork 
{ 
    private readonly JRES_Context _context;    

    public UnitOfWork(JRES_Context context) 
    { 
     _context = context;    

     table1_UOW = new table1Repository(_context);    

     table2_UOW = new table2Repository(_context);    

    }      

    public Iinterface1 table1_UOW { get; private set; } 

    public Iinterface2 table2_UOW { get; private set; } 

    public int Complete() 
    { 
     return _context.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 
} 

一つのものがある私を困惑:なぜ2以前に定義されたインタフェースが宣言されていますか?それを実装するインタフェースの目的ではない(それによって、それを実装するオブジェクトの内部で動作を強制する)か?私は別の良い目的があるかどうか疑問に思いました(インターフェースはUIレイヤーでいくつかの 'Get'メソッドを定義しています) - これをコード化する良い方法があるかもしれません。

+1

コンポジションの継承をお読みください。 – BradleyDotNET

+2

なぜこのクラスはインターフェイスを実装する必要がありますか? table1Repositoryとtable2Repositoryはすでにそれらを実装しています(そうでなければ、それらのクラスのインスタンスをあなたのプロパティに割り当てることができませんでした)。 –

+1

実際に何かのためにインターフェイスを使用したことがない場合、インターフェイスを実装する際のポイントは何ですか?インターフェースを実装するポイントは、他のコードがそれらのインターフェースを物事に使用できるようにすることです。 – Servy

答えて

4

table1_UOWは、たとえば、タイプがIinterface1のプロパティです。このクラスでそのインターフェイスで作業するには、そのインターフェイスを実装する必要はありません。

おそらくそれらはソリューションの別の場所に実装されていますが、これらのプロパティはインターフェイスを実装するインスタンスに設定する必要があります。そうでなければ実行時にメンバーにアクセスする際に例外が発生します。 IoCコンテナを使用します。あなたはtable1_UOWとtable2_UOWを参照している、それらが宣言をインタフェースするのではなく、公的たUnitOfWorkのアクセスプロパティされていないと仮定すると、

+0

これらはインターフェイスの*恐ろしい*名前であることに言及する必要があります。 –

+1

私は答えとしてそれを取るでしょう。 Table1Repository/table2Repositoryテーブルの実際の宣言は、明らかにUIレイヤーでは見付かりません。 [コードに多くの緩やかな終わりがある、私はちょうどテーブル1を明確にしたかった。]ありがとう、すべて! –

+0

はい、言及する必要があります=)彼らは進行中の仕事だと推測します – Stuart

0

。基本的には、UnitOfWorkを使用してtable1_UOWやtable2_UOWの機能に実際にアクセスすることなく、その実装の詳細(実際にどのクラスか、実際にどのように機能を果たすかなど)を決して許すことはできません。 UnitOfWorkのインターフェースIUnitOfWork、Iinterface1、Iinterface2について知っておく必要があり、それらを実装するクラスの詳細ではありません。この種の情報隠蔽は、オブジェクト指向のコードをモジュール化して扱いやすくするために重要です。

関連する問題