我们说我有以下回购模式:
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
还是ViewModel
?
服务层应该使用我的仓库1:1映射吗?
我已经环顾了几天,但我对这些答案并不满意。
任何帮助都会受到赞赏并为糟糕的英语道歉。
谢谢。
更新:
Difference between Repository and Service Layer?
我已经读过这个了。我已经知道那些2之间的区别,但我想知道为什么和目的。所以这不能回答我的问题
答案 0 :(得分:15)
<强> TL; DR 强>
<强>解释强>
典型的3层架构由表示层,服务/域层,数据访问层(DAL)组成。
将服务层视为应用程序的“核心”。 Tipical Service Layer仅具有将在DAL中实现的存储库接口。
因此,它允许您“轻松”切换访问数据的方式。服务层返回的对象不应该是DAO,因为毕竟,表示层甚至不“知道”DAL存在。
方案: 你有一个3层解决方案。目前在拥有所有图层方面没有多大意义。
/-------------------\
| Web App | <--- Presentation Layer
|-------------------|
| Service Library | <--- Service Layer
|-------------------|
| Entity Framework | <--- Data Access
\-------------------/
现在,您希望在ASP.NET MVC WebApi中使用REST API
/--------------------\
| 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
\--------------------/
请注意,我们添加了一种新形式的Presentation并切换了访问Data的方式,但服务层从未更改。
Tipically Service Layer公开了要在数据访问层中实现的接口,因此我们得到了我们想要的“抽象”。
我在大学实施了这个架构的项目。您可以查看代码HERE
我希望这有帮助。对不起,如果我很无聊@解释事情:P
答案 1 :(得分:4)
Ad.1服务层应该是整个业务逻辑的地方。它更多的是关于单独的责任:
Controller - 负责准备viewModel并传递给特定视图,
存储库 - 负责从DB收集实体的抽象层
服务 - 负责复杂的逻辑。通常情况下,服务使用许多实体来制作逻辑并仅返回DTO。
Ad.2在我看来,服务层应该返回应该映射到控制器中的viewModels的DTO对象。
Ad.3不是这样的。在您的示例中,您可以将GetBadCust和GetGoodCust从repo移动到服务并返回一些DTO