0

私はASP.netMVCの初心者です。そしてそれはWebFormsよりもずっと好きです。

そこで、約6つのテーブルを含むプロジェクトを開始することにしました。

  1. ギャラリー
  2. 管理者
  3. セッション
  4. SessionImages
  5. オファー
  6. 情報

私は2つのプロジェクトを作成しました:FP.WebUIFP.Domain

ドメインプロジェクト内に、3つのフォルダーAbstractConcreteを作成しましたEntities

Abstractフォルダー内には、6つのインターフェースなどがあります。各インターフェースには次のようなものがありますIGalleryISessions

namespace FP.Domain.Abstract
{
    public interface IGallery
    {
        IQueryable<Gallery> Gallery { get; }

    }
}

そして、Concreteフォルダ内には別の7つのクラスがあります:EFDbGalleryEFDbSessions...そしてクラスEFDbContextから継承しDbContextます。

上記の各クラス(を除くEFDbContext)は、対応する各インターフェイスを実装します。

今考えてみると、すべてのエンティティを定義する1つのインターフェイスと、Concreteそのインターフェイスを実装するフォルダ内の1つのクラスのみを作成できることがわかりました。


私は本当に何が良いのかわかりません:

6つのインターフェース、エンティティごとに6つのクラス。

また

1つのインターフェース、すべてのエンティティを返す1つのクラス。

4

2 に答える 2

1

あなたはリポジトリパターンに出くわしたようです。典型的なアーキテクチャ上の決定は、インターフェイスを作成することです

interface IRepository
{
    IQueryable<Gallery> Query { get; }
}

次に、ORMクラスにリポジトリインターフェイスを実装してもらいます。

class MyDbContext : DbContext , IRepository
{

}

さて、この時点で、あなたの質問に答えるために、6つのクラスと6つのインターフェースを使用するか、1つのクラスと1つのインターフェースを使用するか、答えは断固としてNOです!

典型的なパターンはGENERICインターフェースを必要とします(したがって、実際には6つのインターフェースがありますが、単一のインターフェースソースであり、追加の呼び出しが必要な場合は、ジェネリックを拡張できます)。

//Actually this implementation is edging on 
//Unit Of Work
interface IRepository<T>  
{
    IQueryable<T> Query { get; }
    void Insert(T item);
    void SaveChanges();
}

次に、EfContextがすべてのインターフェースを公開します。その理由は、通常、コントローラーが機能するために必要なインターフェースは1つだけであり、これにより、コントローラーでのモック/フェイクテストが非常に簡単になります(GalleryControllerTestのInfoQueryなどの未使用のメソッドの実装を作成する必要はありません)。

インターフェイスにドメイン固有のコードが必要な場合は、IRepositoryインターフェイスを拡張できます。

interface IGalleryRepository : IRepository<Gallery>  
{
    void SomeSpecialOperation(Gallery item);
}

最後に、このパターンを実装すると、制御の反転の導入を開始した場合に、作業がはるかに簡単になります。

PS私は通常、実際のEFコード(つまり、具体的なリポジトリ)を別のアセンブリにリファクタリングします。これは、プロジェクトからEFを削除することにした場合に備えてです。

于 2013-02-26T02:41:22.747 に答える
0

責任が異なるので、7つのクラスを使用します。

于 2013-02-26T01:02:59.797 に答える