Asp.net mvc 如何将控制器连接到服务层和存储库层
假设我有以下映射到数据库表的实体(每个匹配的属性名称都可以被视为PK/FK关系): 我的架构如下:控制器调用服务层,该层调用存储库层 我有一个名为Asp.net mvc 如何将控制器连接到服务层和存储库层,asp.net-mvc,entity-framework,asp.net-mvc-2,entity-framework-4,repository,Asp.net Mvc,Entity Framework,Asp.net Mvc 2,Entity Framework 4,Repository,假设我有以下映射到数据库表的实体(每个匹配的属性名称都可以被视为PK/FK关系): 我的架构如下:控制器调用服务层,该层调用存储库层 我有一个名为AddExecutive的视图,该视图收集以下信息:名字、姓氏、电话号码、工资和OfficeNumber 考虑到我的体系结构,提交这些数据的最佳方式是什么?我想我会发布一个ViewModel,其中包含我收集的所有信息,并将其传递给一个服务方法AddExecutive(AddExecutiveViewModel AddExecutiveViewModel
AddExecutive
的视图,该视图收集以下信息:名字、姓氏、电话号码、工资
和OfficeNumber
考虑到我的体系结构,提交这些数据的最佳方式是什么?我想我会发布一个ViewModel,其中包含我收集的所有信息,并将其传递给一个服务方法
AddExecutive(AddExecutiveViewModel AddExecutiveViewModel)
,然后在该服务方法中,我会创建个人、员工、高管、,
和联系
并将它们彼此连接(个人
对象),并将所有数据传递到存储库方法AddExecutive(个人)
。然后,存储库方法将简单地提交数据。听起来对吗?什么是更好的解决方案?只要保持关注点的分离,就可以了。
控制器:将数据绑定到服务/模型
服务:强制执行业务逻辑,将持久性交给回购
Repo:执行ACID事务和查询
如果您的viewmodel与任何类型的框架关注点(即POCO)分离,那么您应该很好,因为您保持了可测试性。当您谈论提交数据时,您谈论的是一个工作单元。从这里开始:
public ActionResult AddExecutive(AddExecutiveViewModel addExecutiveViewModel)
{
// simplified; no error handling
using (var uow = new UnitOfWork()) // or use constructor injection on the controller...
{
// ???
uow.Commit();
}
return RedirectToAction(// ...
}
现在,您的服务来自工作单元(因为工作单元和存储库在后台共享一个ObjectContext
;ObjectContext
是EF的“本机”工作单元)。因此,我们可以填写/?
:
public ActionResult AddExecutive(AddExecutiveViewModel model)
{
// simplified; no error handling
using (var uow = new UnitOfWork()) // or use constructor injection on the controller...
{
uow.EmployeeService.AddExecutive(model);
uow.Commit();
}
return RedirectToAction(// ...
}
uow.Commit()
是ObjectContext.SaveChanges()
周围的薄壳。工作单元注入了与存储库相同的ObjectContext
。这些服务是免费的
对于一个工作(尽管处于早期阶段)的示例,请参阅我的开源存储库/服务项目。关于关注点分离(hehe),我主要关心的是我是否应该为每个实体提供服务和存储库。为什么对我来说,只有一个行政服务和仓库是可以的?是因为其他实体可以链接在一起吗?不是。服务有功能问题。(粗略地说,基本上是针对每个用户案例的方法)。服务将信息作为输入,您可以通过原语或自定义类来实现这一点。如果使用自定义类,请确保它保持在消息上,即:不做一个大的OL状态包来传递您的参数。您会考虑上面描述的AdExtCuvVIEWWW模型是否是“大OL状态包”?概念上是它,但实际上它不是,因为它是一个解耦的专用构建类。在本质上给它起一个不同的名字可以解决这个问题。试试AddExecutive(ExecutiveViewModel ExecutiveViewModel)呵呵。谢谢。您同意服务方法是填充真实实体类并将它们传递(附加到Person对象)到存储库的好地方吗?
public ActionResult AddExecutive(AddExecutiveViewModel model)
{
// simplified; no error handling
using (var uow = new UnitOfWork()) // or use constructor injection on the controller...
{
uow.EmployeeService.AddExecutive(model);
uow.Commit();
}
return RedirectToAction(// ...
}