2011-10-26 1 views
3

私は顧客、注文などのエンティティを自分のドメインモデルで定義しています。データベース固有のタイプがドメインモデルまたはデータアクセスレイヤーに入っていますか?

私は、私のパーシスタンス層を表すためにIRepositoryというインターフェースを定義したいと思います。私はさらに、IRepositoryを実装するSQLRepositoryとCacheRepositoryを持っています。

ドメインモデルまたはデータアクセス層でIRepositoryを定義する必要があるのでしょうか?私はSQLRepositoryとCacheRepositoryはDALに行く必要があると思うが、IRepositoryもそこに行くのだろうか?

さらに、例えば、私のリポジトリはCustomerテーブルからCustomersのリストを返します。これはどうやって設計するのか分かりません.DALとDomain Modelでタイプを繰り返すようです。

:私のDALで

class Customer 
{ 
    public int id; 
    public string name; 
} 

:私のドメインでそう

var repository = new SQLRepository(); 

//Below repository.customers represents customer table 
List<Customer> customers = repository.Customers.list(); 

:私はこのような何かをしたいアプリケーションでは

:以下の例を参照してください。

class SqlRepository:IRepository { public CustomerTable Customers; } class CustomerTable { public List<Customer> list(); } 

これらのレイヤーを設計するより良い方法があるかどうかを知りたかったですか?

* UPDATE

私はすでに別のクラスライブラリ/アセンブリで定義されDALとドメインを持っています。当初、私はデータベーステーブルのレコードを表すCustomerのようなPOCOエンティティを持つと思っていましたが、Customer.Add(customer)はどこに宣言しますか?それはDALに入っていますか?私はDALでビジネスルールを望んでいません。エンティティにメソッドを追加し始めると、永続ロジックとビジネスロジックが複雑になります。

答えて

0

... SQL層(前処理)、ビジネスロジック層とオブジェクトモデルが共有する共通のアセンブリに定数を置くことに類似したアプローチです単純なプロジェクトの構造:Placing Model in separate assembly

私の意見は、IRepositoryインターフェイスは、DataLayerプロジェクトで公開する必要があります。実装はプライベート(他のプロジェクトでロードするためにFactoryまたはDependency Injectionを使用することができます)で、作成したドメインモデルをビジネスレイヤーとデータレイヤーで共有することができます。

+0

可能であれば、独自のアセンブリでレイヤーを分割することも考えています。 – mozillanerd

+0

はいレイヤーを別々のアセンブリに分割します。これにより、物理層にレイヤーを配布する機会も与えられます。 –

+0

私は既にDALとドメインを異なるクラスライブラリ/アセンブリで定義しています。当初、私はデータベーステーブルのレコードを表すCustomerのようなPOCOエンティティを持つと思っていましたが、Customer.Add(customer)はどこに宣言しますか?それはDALに入っていますか?私はDALでビジネスルールを望んでいません。エンティティにメソッドを追加し始めると、永続ロジックとビジネスロジックが複雑になります。 – newbie

0

1つのオプションは、ビジネスレイヤーとデータレイヤーによって参照される別の共通またはタイプのアセンブリに型を配置することです。そのアセンブリに入るものを制限して、不要な結合を導入しないように注意してください。

それは次のような情報が、それはあなたを示す別の問題のためである

関連する問題