从ViewModel访问控制器数据

时间:2016-10-23 17:35:19

标签: c# asp.net-mvc dependency-injection asp.net-core-mvc

我正在开发ASP.NET Core应用程序。为了保持控制器的精简,大多数数据操作都是在ViewModels中完成的。一切都很好 - 然而,这两个问题是

  1. ViewModel无权访问ControllerContext信息(或者我无法弄清楚如何获取它)。例如,会话,用户和其他任何控制器免费获得。

  2. ViewModel不接受依赖注入(再次,或者我无法弄清楚如何传递它)。例如,如果我有构造函数MyController(ApplicationDbContext db),我会毫无问题地通过db。但是,如果我ComplexViewModel(ApplicationDbContext db),我会收到null。显然,我在启动时有services.AddDbContext<ApplicationDbContext>()

  3. 现在我明确地将所需的一切从Controller传递给ViewModel。但它觉得应该有更好的方法。

1 个答案:

答案 0 :(得分:1)

视图模型应该是简单的POCO,用于在视图和操作方法之间传输数据。我认为将所有业务逻辑(甚至数据访问)与视图模型混合是一个坏主意。您可以考虑在服务中执行此操作。您可以将此服务注入控制器。

例如。

哟获取用户信息,您可以考虑创建服务

public interface IUserService
{
  UserDto GetUser(int id);
}
public class UserService : IUserService
{ 
  IUserDataAccess userDataAccess;
  public UserService(IUserDataAccess userDataAccess)
  {
    this.userDataAccess=userDataAccess;
  }
  public UserDto GetUser(int id)
  {
     // with this.userDataAccess, get a User and map to UserDto
    // to do : return something
  }
}

所以你的控制器会保持精益

public class UserController : Controller
{
  private readonly IUserService userService;
  public UserController(IUserService userService)
  {
    this.userService = userService;
  }
  public ActionResult Details(int id)
  {
    var userDto= this.userService.GetUser(id);
    return View(userDto);
  }
}

现在您可以使用UserDataAccess查询您的数据并将其注入UserService类。

使用这种方法,您的视图模型不知道您正在使用哪种数据访问技术。想象一下明天你决定抛弃EF出于性能原因而想要切换到Dapper,你只需要创建一个名为“IUserDataAccess”的DapperUserDataAccess的新实现,然后用你的DI配置注册来使用它。没有其他代码更改:)

相关问题