我有我的域模型(用于与EF结合并用于映射到数据库):
public class Category : BaseEntity
{
public string Name { get; set; }
public Category ParentCategory { get; set; }
//Code removed for brevity
}
然后,我有一个共享控制器来在我的视图中使用此菜单显示类别菜单:
@Html.Action("GetCategoryMenu", "Shared")
控制器
[OutputCache(Duration = int.MaxValue, VaryByParam = "none")]
public ActionResult GetCategoryMenu()
{
var viewModel = new CategoryMenuViewModel
{
Categories = _categoryService.Get().Where(c => c.ParentCategory != null && c.ParentCategory.Id == WebsiteContext.CurrentWebsite.CategoryId)
};
return PartialView("_CategoryMenu", viewModel);
}
和ViewModel:
public class CategoryMenuViewModel
{
public IEnumerable<Category> Categories { get; set; }
}
我现在的问题是,如果我实现了像category.GetUrl()
在我看来那样的用途,将会去哪儿?域模型是类似这样的正确位置吗?
GetUrl()
将运行一些逻辑并根据某些条件返回一个Url。我从视图本身看到将其嵌入到超链接中。它会按类别运行,实际上只是获得一个Url,以防日后我想更改生成它们的方式。
本质上,我试图在局部视图中实现此目的以呈现类别菜单:
@foreach (Category category in Model.Categories)
{
<li class="list-group-item clearfix">
<a href="@category.GetUrl()"><i class="fa fa-angle-right"></i> @category.Name</a>
</li>
}
我现在正在寻找最佳实践建议,因为我想确保自己正确理解MVC模式,因为我对将GetUrl()
方法放置到域模型中有一种奇怪的感觉,但我不知道为什么。
基本思想是以一种方式创建应用程序,使您可以替换彼此之上的层而不接触基础层。一个典型的例子是三层体系结构。这意味着您的GUI仅访问逻辑层(业务模型),而逻辑层仅访问数据库层(实体框架)。由于Entity Framework的设计方式,最后一部分有点麻烦:当您将业务逻辑放入实体类本身时,EF已经将逻辑层与数据层混合在一起。
但是,对于上两层,您应该尊重这种分离。执行GUI任务的方法,例如,GetUrl
不应属于域类。例如,将来可能需要更改GUI,而URL现在具有不同的布局。然后,您需要更改域模型,这不是应该的。
正确的方法是创建其他视图模型,然后将所需的属性从业务对象映射到视图模型。但是,您确实想避免这种情况,您可能会考虑在GUI项目中为业务类定义扩展方法。
附带说明:我已经完全按照您的建议进行了操作,即使用通过Entity Framework获得的业务对象作为视图模型。注意这带来的限制,尤其是在将更改保存回EF方面。即使它们是实体,您通常仍需要映射已发布到您的对象,因为它们是由MVC模型绑定程序实例化的,并且不会通过EF上下文检索,即它们无法保存为现有对象的更新版本。 。解决此问题的一种方法可能是创建自定义模型联编程序,但是我确实认为最好通过创建视图模型和映射来实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句