は私の質問ですし、私は彼らのためにあなたの背景をあげる:アドバイス
私はそうです、私のアプリケーションの設計と方法2を使用することを好むだろう方法1のようなフィルタリングを提供し、ビジネス以外のコードへの参照を導入せず、コアプロジェクトのデータベースモデルへのアクセスを許可しない方法がありますか?
コードの再利用はどのように処理しますか?各オブジェクトの名前空間はProject.Core.DomainまたはProject.Core.Servicesのようなものですが、そのプロジェクトに格納されていない場合はCompanyName.Core.Domainのような名前空間を作成するのは変です。現在、私はソースコードファイルをコピーして名前空間の名前を変更してこれを処理していますが、これを処理するための組織的な方法があるのか、それとも考えていないものがあるのでしょうか?
私が使用している技術:
- ASP.NET MVC 3
- LINQのツーSQL
- のStructureMap
- 部品番号
- MSTestを
方法1:
は、ここで私はセットアップに私のWebプロジェクトを使用方法は次のとおりです。
データプロジェクトは、すべてのリポジトリ、およびLINQのデータコンテキストを含んでいるでしょう。リポジトリでは、IQueryableを使用してデータベースからオブジェクトのコレクションを返します。
public IQueryable<Document> List()
{
return from d in db.Documents
select d;
}
これにより、静的メソッドであるフィルタを設定することができました。これらはデータプロジェクトにも格納されていました。
public static IQueryable<Document> SortByFCDN(this IQueryable<Document> query)
{
return from d in query
orderby d.ID
select d;
}
サービスレイヤでは、このようにフィルタを適用できます。
public IPagedList<Document> ListByFCDN(int page, IConfiguration configuration)
{
return repository.List().SortByFCDN().ToPagedList(page, configuration.PageSize, configuration.ShowRange);
}
したがって、リポジトリのみのIQueryableオブジェクトとしてすべてのアイテムを返却した後、サービス層は、データのサブセットを返す前にそれをフィルタリングする方法を決定するであろうLISTALL方法を提供しなければなりません。
私はこのアプローチが好きで、サービスのコードの大半を残しながら私のリポジトリをきれいにしました。
方法2
ここではどのように現在のセットアップの私のWebプロジェクトです:オニオンアーキテクチャを使用して
:
- コアは:ビジネスドメインモデル、すべてのインターフェイスが含まれていますが、アプリケーションとサービスクラスの実装については、
- インフラストラクチャ:Linqデータベースモデルをビジネスモデルにマッピングするためのリポジトリ実装、Linqデータコンテキスト、およびマッピングクラスが含まれます。
私はビジネスコードをデータベースコードから分離しているので、LinqのようなものにCoreプロジェクトの参照を追加してIQueryableにアクセスしたくないです。そこで、私は、リポジトリ層でフィルタリングを実行し、データベースモデルをドメインモデルにマップしてから、ドメインオブジェクトの集合をサービス層に返さなければなりませんでした。これは私のリポジトリに追加のメソッドを追加する可能性があります。
1)コア事業におけるフィルタリング列挙オブジェクトを作成: