次のレポパターンがあるとします。
interface IGenericRepo<T> where T : class
{
IEnumerable<T> GetAll();
T GetById(object id);
void Insert(T obj);
void Update(T obj);
void Delete(T obj);
void Save();
}
interface ICustRepo : IGenericRepo<Cust>
{
IEnumerable<Cust> GetBadCust();
IEnumerable<Cust> GetGoodCust();
}
public class CustRepo : ICustRepo<Cust>
{
//implement method here
}
それから私のコントローラーで:
public class CustController
{
private ICustRepo _custRepo;
public CustController(ICustRepo custRepo)
{
_custRepo = custRepo;
}
public ActionResult Index()
{
var model = _custRepo.GetAll();
return View(model);
}
public ActionResult BadCust()
{
var model = _custRepo.GetBadCust();
return View(model);
}
}
基本的に私のパターンは次のようなものです
View <-> Controller -> Repo -> EF -> SQL Server
多くの人がこれをやっているのを見ました
View <-> Controller -> Service -> Repo -> EF -> SQL Server
だから私の質問は:
なぜ、いつ必要なのかservice layer
?すべての非ジェネリックメソッドは既にICustRepo
に実装されているので、それは単に別の不要なレイヤーを追加するだけではありませんか?
サービスレイヤーはDTO
またはmy ViewModel
を返す必要がありますか?
サービスレイヤーは私のリポジトリと1:1でマッピングする必要がありますか?
私は数日間周りを見回しましたが、答えに満足していません。
どんな助けでも歓迎され、悪い英語をお詫びします。
ありがとうございました。
更新:
私はこれをすでに読んだ。私はこれら2つの違いを知っていますが、理由と目的を知りたいです。だから私の質問には答えません
TL; DR
説明
典型的な3層アーキテクチャは、プレゼンテーション層、サービス/ドメイン層、データアクセス層(DAL)で構成されています。
サービス層は、アプリケーションの「コア」と考えてください。通常、サービスレイヤーには、DALに実装されるリポジトリインターフェイスのみがあります。
そのため、データへのアクセス方法を「簡単に」切り替えることができます。結局のところ、プレゼンテーション層はDALが存在することさえ「認識」していないため、サービス層によって返されるオブジェクトはDAOであってはなりません。
シナリオ:3層ソリューションがあります。現在、すべてのレイヤーを持つことはあまり意味がありません。
/-------------------\
| Web App | <--- Presentation Layer
|-------------------|
| Service Library | <--- Service Layer
|-------------------|
| Entity Framework | <--- Data Access
\-------------------/
REST API in ASP.NET MVC WebApi
/--------------------\
| Web App | REST API | <--- Presentation Layer
|--------------------|
| Service Library | <--- Service Layer
|--------------------|
| Entity Framework | <--- Data Access
\--------------------/
たとえば、Entity Frameworkをデータアクセスとして使用する必要がなくなり、NHibernateを使用したいとします。
/--------------------\
| Web App | REST API | <--- Presentation Layer
|--------------------|
| Service Library | <--- Service Layer
|--------------------|
| NHibernate | <--- Data Access
\--------------------/
新しい形式のプレゼンテーションを追加し、データへのアクセス方法を切り替えましたが、サービス層は変更されていないことに注意してください。
通常、サービス層はデータアクセス層に実装されるインターフェイスを公開するため、必要な「抽象化」を実現できます。
私は大学でこのアーキテクチャを使用してプロジェクトを実装しました。あなたはコードをチェックアウトすることができます [〜#〜]ここ[〜#〜]
これがお役に立てば幸いです。私が説明するのがとても退屈な場合は申し訳ありません@説明すること:P
Ad.1サービスレイヤーは、ビジネスロジック全体に配置する必要があります。それは、個別の責任についての詳細です。
コントローラ-viewModelを準備して特定のビューに渡す責任があります。
リポジトリ-DBからのエンティティの収集を担当する抽象レイヤー
サービス-複雑なロジックを担当します。サービスが多くのエンティティを使用してロジックを作成し、DTOのみを返す場合がよくあります。
Ad.2私の意見では、サービスレイヤーは、コントローラーのviewModelsにマップされるDTOオブジェクトを返す必要があります。
Ad.3いいえ、そうではありません。あなたの例では、GetBadCustとGetGoodCustをリポジトリからサービスに移動し、DTOを返すことができます