Asp.net mvc 如何将控制器连接到服务层和存储库层

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

假设我有以下映射到数据库表的实体(每个匹配的属性名称都可以被视为PK/FK关系):

我的架构如下:控制器调用服务层,该层调用存储库

我有一个名为
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(// ...
}