【发布时间】:2014-03-06 11:28:26
【问题描述】:
我正在重构我正在进行的项目。在我现有的控制器中,我确实使用了存储库模式,但我仍然执行了太多的脚手架,而不是我觉得舒服的。那和我的一些控制器可能有 10 多个存储库传入(通过 Ninject)。因此,我决定引入一个服务层,我的目的是为每个控制器提供一个服务,而每个服务将注入多个存储库并完成我需要的工作。到目前为止效果很好,但我遇到了各种各样的困惑:如何将模型验证从控制器移到服务层?
例如,看看我的OfficesController 上的这个Edit 方法:
[HttpPost]
public async Task<RedirectToRouteResult> Edit(
short id,
FormCollection form,
[Bind(Prefix = "Office.Coordinates", Include = "Latitude,Longitude")] Coordinate[] coordinates) {
if (id > 0) {
Office office = await this.OfficesService.GetOfficeAsync(id);
if ((office != null)
&& base.TryUpdateModel(office, "Office", new string[2] {
"Name",
"RegionId"
}, form)
&& base.ModelState.IsValid) {
this.OfficesService.UpdateOfficeAsync(office, coordinates);
}
return base.RedirectToAction("Edit", new {
id = id
});
}
return base.RedirectToAction("Default");
}
与控制器的方法相比,它的问题是我仍然从数据库中获取Office 对象,进行更新、验证,然后再次保存。在这种情况下,复杂性增加而不是减少。之前,我在方法中调用存储库,现在我调用调用存储库的服务来执行相同的功能。到目前为止,这种复杂性的增加只在我的 Edit 方法中表现出来,在其他任何地方,复杂性都大大降低了,这正是我想要的。
那么,什么是移动验证的正确方法,现在我想一想,模型更新逻辑从控制器到服务中?非常感谢您的建议!
作为参考,我的项目结构如下:
- 数据:包含我所有的模型类
- Data.Google.Maps:包含我需要反序列化特定 Kml 的所有类
- Data.Models:包含我的 DbContext、配置、视图模型和部分视图模型
-
Data.Repositories:包含我所有与 DbContext 对话的存储库。由于 EF 本身就是一个伪存储库,因此我正在利用我的“存储库”作为查询数据的更具体的方式。例如:
FindTechnicians()或FindActive()等 - Data.Services:包含我将使用的所有服务。这些服务将注入一个或多个存储库,并在我将完整的视图模型传回控制器之前执行我需要完成的所有逻辑。
- Identity:包含我的 ASP.NET Identity 实现。
- Web.Private:包含实际的 MVC 项目。
【问题讨论】:
-
您的服务有多少存储库依赖项?你是刚刚解决了依赖过度注入的问题,还是解决了?
-
我只是将它移到服务层,因为我知道我必须对一些存储库的结果做一些更复杂的事情,然后然后将完成的模型传递到控制器。
标签: c# asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6