如何将Controller连接到Service层到Repository层

时间:2010-10-27 02:51:21

标签: asp.net-mvc entity-framework asp.net-mvc-2 entity-framework-4 repository

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

public class Person
{
  public int PersonID { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

public class Employee
{
  public int EmployeeID { get; set; }
  public int PersonID { get; set; }
  public int Salary { get; set; }
}

public class Executive
{
  public int ExecutiveID { get; set; }
  public int EmployeeID { get; set; }
  public string OfficeNumber { get; set; }
}

public class Contact
{
  public int ContactID { get; set; }
  public int PersonID { get; set; }
  public string PhoneNumber { get; set; }
}

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

我有一个名为AddExecutive的视图,它收集以下信息:FirstName, LastName, PhoneNumber, SalaryOfficeNumber

根据我的架构,提交此数据的最佳方法是什么?我想我会发布一个包含我收集的所有信息的ViewModel并将其传递给Service方法AddExecutive(AddExecutiveViewModel addExecutiveViewModel),然后在Service方法中我将创建Person, Employee, Executive,和{的新实例{1}}并将它们相互附加(Contact对象)并将所有数据传递给存储库方法Person。然后,Repository方法将简单地提交数据。听起来不错吗?什么是更好的解决方案?

2 个答案:

答案 0 :(得分:2)

只要你保持关注的分离你就好。 控制器:将数据绑定到服务/模型 服务:强制执行业务逻辑,坚持使用Repo 回购:执行ACID交易和查询。

如果你的视图模型与任何类型的框架问题分离(即:一个POCO)你应该保持良好,因为你保持可测试性。

答案 1 :(得分:0)

当你谈到提交数据时,你谈论的是一个工作单元。所以从那里开始:

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。这些服务是EF无知的。

有关工作(尽管处于早期阶段)的示例,请参阅我的开源存储库/服务项目Halfpipe