4

ASP.NET Web フォームから MVC 2.0 に移行しています。ほとんどのプロジェクトでは、データベースと通信するための典型的なセットアップがあります。

共通(「SiteMenu」や「Users」などのオブジェクト/エンティティ)

ビジネス ロジック層(データ アクセス層への呼び出しを含む)

データ アクセス層

DAL には、共通のデータベース操作を行う DatabaseHelper、データベース固有の操作 (MySQL など) を行う OdbcHelper、およびすべてのストアド プロシージャを含む StoredProcedure クラスがあります。

この設計はリポジトリ設計にどのように変換されますか? NHibernate などの代わりに、独自のデータベース ヘルパーを使用したいと考えています。

何を提案しますか?

4

2 に答える 2

3

すべてのデータアクセステクノロジーを使用してリポジトリを活用できます。リポジトリは、既存のデータアクセスヘルパー/サービスを抽象化したものであり、データアクセス層からビジネスロジックを分離できます。フィルタリングを有効にするためにQueryと一緒に使用されるリポジトリ。多くの場合、変更をデータベースに保存するために作業単位と一緒に使用されます。

リポジトリには少なくとも次のものがあります。

  1. キーごとのオブジェクトの取得操作
  2. すべてのオブジェクトを取得操作
  3. Get-first-object-by-query操作
  4. クエリによるオブジェクトの取得操作

非常に簡単な例:):

A. Commonで定義されている製品クラス:

public class Product
{
    public int Id { get; private set; }

    public string Code { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set; }
}

B. QueryIRepository、およびIUnitOfWorkのクラスは、 DAL.interfaces.dllまたはCommon.dllで定義されています(ただし、DALでは定義されていません)。

public class Query
{
    public string Text { get; set; }
}

public interface IRepository<TEntity>
    where TEntity : class
{
    bool TryGet(int key, out TEntity value);

    TEntity this[int key] { get; }

    IEnumerable<TEntity> GetAll();

    bool TryGetFirst(Query condition, out TEntity value);

    TEntity GetFirst(Query condition);

    IEnumerable<TEntity> GetAll(Query condition);

    int Count { get; }
}


public interface IUnitOfWork
{
    void SetAdded(TEntity value); // Marks entity as added for further INSERT

    void SetRemoved(TEntity value); // Marks entity as removed for further DELETE

    void SetChanged(TEntity value); // Marks entity as modified for further UPDATE

    void Save(); // Save all the changes 
}

IUnitOfWorkは、変更されたエンティティを認識します。Save()は、データベース内の変更を永続化するために、変更されたエンティティごとに適切なDatabaseHelper /OdbcHelperCRUDメソッドを呼び出します。

IRepository <Product>、... IRepository <EntityXY>およびIUnitOFWorkの実装は、DALに配置する必要があります。次に、BLLは、ビジネス(ドメイン)ロジックを実装するためにIRepositoryIUnitOFWorkを使用します。BLL自体は、ドメインモデルの最上位にあるサービス層として編成できますが、説明の範囲外です:)。

私の答えがお役に立てば幸いです。

お気軽にご質問ください...

リンク: MartinFowlerによるエンタープライズアプリケーションアーキテクチャのパターン

于 2011-04-20T20:12:53.943 に答える
1

MVCに移行するときに、同じ階層化アプローチを維持できます。エンティティ/オブジェクトを返すBLLは、MVCのMにすることができます。多くの場合、サンプルでは、​​ユーザーがコントローラーで直接リポジトリのインスタンスを作成します。この場合、BLLクラスのインスタンスを作成します。

于 2011-02-08T13:24:11.003 に答える