填写Model for UserControl的正确方法是什么?

时间:2011-06-02 12:14:18

标签: c# model-view-controller architecture s#arp-architecture

问题不在于MVC,而在于代码架构。

我的部分视图需要CompanyModel

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyModel>" %>

<%: Html.TextAreaFor(m => m.Name) %>
<%: Html.TextAreaFor(m => m.Location) %>

CompanyModel

public class CompanyModel
{
     [LocalizedDisplayName("Name", NameResourceType = typeof(Resources.Views.CompanyBackground))]
     public string Name{get;set;}
     [LocalizedDisplayName("Location", NameResourceType = typeof(Resources.Views.CompanyBackground))]
     public string Location{get;set;}

     public CompanyModel()
     {
          var info = Project.GetCompanyInfo();
     }
}

Project.GetCompanyInfo()是DAL层,使用Entity Framework

从数据库获取数据

我的问题:填充CompanyModel的“好”和正确方法是什么?:

解决方案1 ​​

创建 CompanyBag

public class CompanyBag
{
     public string Name{get;set;}
     public string Location{get;set;}
}

Project.GetCompanyInfo()将返回CompanyBag,并在CompanyModel的.ctor中填写模型。

解决方案2

Project.GetCompanyInfo()将返回CompanyModel(因此不需要帮助程序类),我将填充Model

的.ctor中的CompanyModel

解决方案3

也许是你的解决方案?

更新 我有LoadController加载动作,这个动作是一种工厂。它将采用视图列表并通过反射创建它们,然后通过Html.RenderPartial(viewName, viewModel)加载到页面。因此,CompanyModel只是视图的一个示例,因此我需要每个视图都是独立的。

所以我的问题是:GetCompanyInfo应该返回CompanyBag还是CompanyModel,我会在.ctor中填写模型吗?

谢谢

2 个答案:

答案 0 :(得分:2)

好的,问题更新后,这是我更新的答案:)

我假设不同的视图LoadController填充使用不同类型的ViewModel,并且每个ViewModel都填充在域模型的不同部分。以下是我要解决的问题:

首先,将每个部分视图创建为ViewUserControl<TViewModel>的强类型子类,因此LoadController可以确定它被告知要创建的每个视图所需的ViewModel类型

其次,定义一个IViewModelFactory<TViewModel>接口,并为您需要的每个ViewModel类型创建一个实现;每个实现都将知道如何从您的域模型中创建和填充其ViewModel类型。

最后,LoadController会确定要求创建的每个视图所需的ViewModel类型,并使用相应的IViewModelFactory创建它。

为了避免不必要的开销,LoadController可以find all the available IViewModelFactory implementations at runtime,并根据他们创建的ViewModel类型保留静态存储。

总而言之:我会使用CompanyViewModelCompany填充CompanyViewModelFactory,我会使用{{}填充UserViewModel User {1}}等等:))

答案 1 :(得分:0)

为什么不使用增强查询对象直接向您提供ViewModel而无需先获取完整实体图?

http://www.yellowfeather.co.uk/2011/03/enhanced-query-objects-with-sharp-architecture/

我意识到Chris为NHibernate写了这个,但它应该足以让你知道你能做什么。

除此之外,我不能提供任何史蒂夫已经说过的话。请注意他的#2。无法强调这一点。