【发布时间】:2014-05-23 15:42:56
【问题描述】:
我正在处理一个大型 ASP.NET MVC 项目(大约 15 个单独的项目)。我们正在使用外观设计模式来调用业务逻辑以及其他项目。
问题:在 MVC 应用程序中,从 ViewModel 调用 Facade 是最佳实践吗?
我使用单个外观实例来调用所有函数。我为每个 Action 创建一个 ViewModel,并使用 ViewModel 中的数据填充它。这些结果使 ViewModel 变得更大,但 Controller Action 变得更薄,因为我们现在正在 ViewModel 中进行工作。在 ViewModel 构造函数中,我传递外观实例并从业务逻辑层获取所需的内容。
public class MyViewModel
{
private Facade _Facade;
public IEnumerable<SomeModel> Collection { get; set; }
public IEnumerable<SelectListItem> Years { get; set; }
public IEnumerable<SelectListItem> Quarters { get; set; }
public int SelectedYear { get; set; }
public int SelectedQuarter { get; set; }
public BottomUpForecastViewModel(EXFacade facade)
{
this._Facade = facade;
this.Years = GetFinancialYears();
this.Quarters = GetFinancialQuarters();
this.SelectedYear = DateTime.Now.Year;
this.SelectedQuarter = TimePeriods.GetQuarterNoForDate(DateTime.Now);
Collection = GetMonthlyCollection(SelectedYear, SelectedQuarter);// Take data from the _Facade(call facade)
}
}
public class MyController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult BottomUpForecast()
{
return View(new MyViewModel(facade));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult BottomUpForecast(MyViewModel model)
{
return View();
}
}
这是好的做法吗?
考虑到我们不需要担心依赖关系,您有什么更好的方法建议吗?
更新:我发现了一篇关于如何让控制器精益的有趣文章“让他们节食”: http://lostechies.com/jimmybogard/2013/12/19/put-your-controllers-on-a-diet-posts-and-commands/**
【问题讨论】:
-
你可以参考我对这个帖子的回答。我不会在控制器中填充您的 ViewModel。这增加了控制器中的代码量,我认为这通常很糟糕。相反,只需从控制器调用业务层并让业务层填充您的虚拟机。我的控制器代码会这样...
MyViewModel vm = new BusinessLayer().BottomForecastVM(); return view(vm);stackoverflow.com/questions/21597180/…
标签: c# asp.net asp.net-mvc asp.net-mvc-4 viewmodel