Sim*_*mon 8 c# asp.net-mvc asp.net-mvc-4
我已经搜索了SO和Google,但没有找到相关/可接受的答案.
背景:
*使用MVC 4.5
*我Repo<T>
在EF5的顶部使用了一些Generic ,后者又通过泛型访问Service<T>
*我有域模型和视图模型,我使用Automapper在它们之间进行映射,这种映射发生在该Service
层
*最重要的是,我有我Controllers
这又是通用尽可能.
那么,对于这个问题; 我有几个场景,我需要向用户提供一个选项列表,他们必须选择一个或多个.选项是特定于用户的,因此我的域中User
有一个List<Location>
是保存的位置,添加/修改时,Item
需要选择至少一个Location
.
我正在抵制List<Location>
在我的控制器中获取它的诱惑,因为我想让它们保持通用和纤薄,但与此同时,我宁愿在我的ItemView
模型中没有两个属性,一个用于AvailableLocations
和一个用于SelectedLocations
,因为使用了这个模型不只是添加/修改,而是搜索结果等.
选项:
*我应该引入一个不同的模型来添加/修改Item
,例如ItemInput
?
*我应该使用一些自定义映射并获取Automapper来获取可用位置列表吗?
*我应该在哪一层获取这些可用位置?
人们对这个简洁而通用的方法提出了什么建议?
非常感谢!
我会做这样的事情:
public IEnumerable<Location> GetLocations() {
return db.GetAll();
}
Run Code Online (Sandbox Code Playgroud)
然后在你的控制器内部(我从 MVC 脚手架中遵循了这一点):
ViewBag.Locations = new SelectList(service.GetLocations, "name", "id");
Run Code Online (Sandbox Code Playgroud)
(或您自己的复选框列表)并将列表控件放在 HTML/视图页面上。
我认为这是最好的方法的原因是因为逻辑全部驻留在服务内部。如果您将其放入 DTO/数据模型中,您可能会遇到以下问题:
如果您需要额外的逻辑来撤回位置,会发生什么情况?即位置的子位置。
您更改服务(或覆盖)以反映新的更改,并且此逻辑将进入服务内部:
public IEnumerable<Location> GetLocations(string parent) {
return db.GetAll().Where(loc => loc.parentname = parent);
}
Run Code Online (Sandbox Code Playgroud)
ps 我从不使用通用服务,我使用服务的原因是因为它提供的某些数据访问包含不适合通用 DAL 的逻辑。
我可以创建一个接口或抽象服务,以使服务之间的常见操作变得更容易,但是一旦您定义了一个具体的对象,UserManagementSerive
您肯定会说您想要管理一个对象,该对象具有用户、位置和项目,每个对象都有其自己的特定功能?
归档时间: |
|
查看次数: |
163 次 |
最近记录: |