假设我有以下映射到数据库表的实体(每个匹配的属性名称都可以视为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, Salary
和OfficeNumber
。
根据我的架构,提交此数据的最佳方法是什么?我想我会发布一个包含我收集的所有信息的ViewModel并将其传递给Service方法AddExecutive(AddExecutiveViewModel addExecutiveViewModel)
,然后在Service方法中我将创建Person, Employee, Executive,
和{的新实例{1}}并将它们相互附加(Contact
对象)并将所有数据传递给存储库方法Person
。然后,Repository方法将简单地提交数据。听起来不错吗?什么是更好的解决方案?
答案 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。