MVC:Controller知道持久性吗?

时间:2016-01-06 17:45:07

标签: asp.net-mvc asp.net-mvc-5

刚开始使用MVC,长期使用WebForms。

我不想用面向UI的属性来装饰我的实体,例如"显示名称"或者"必需",加上很多方法和属性比我在视图上公开的方法和属性更多。

所以我正在尝试使用ViewModels来包装,或者以其他方式与我系统中的实际实体进行交互。我不喜欢的是Controller如何知道查询存储库然后实例化ViewModel以包装它返回的实体。

控制器与ViewModels交互的最佳做法是什么,而不必知道它们如何持续存在?我看到的所有示例都直接与EntityFramework或其他ORM对话。

我在思考ViewModel类上的静态方法,它们采用IRepository引用和ID来加载和返回ViewModel。这有意义吗?

1 个答案:

答案 0 :(得分:1)

使用DependencyInjection将您的存储库传递给您的控制器。

public HomeController
{
    private readonly IHomeRepository repo;

    public HomeController(IHomeRepository repository)
    {
        repo = repository;
    }
}

然后在您的操作方法中,获取项目,并从这些对象创建ViewModel。

public ActionResult Index()
{
    // IEnumerable models are bad, but this is just a quick demo.
    var viewModels = repo.GetWidgets().Select(w => new WidgetModel(w));

    return View("Index", viewModels);
}