我正在开发ASP.NET Core应用程序。为了保持控制器的精简,大多数数据操作都是在ViewModels中完成的。一切都很好 - 然而,这两个问题是
ViewModel无权访问ControllerContext信息(或者我无法弄清楚如何获取它)。例如,会话,用户和其他任何控制器免费获得。
ViewModel不接受依赖注入(再次,或者我无法弄清楚如何传递它)。例如,如果我有构造函数MyController(ApplicationDbContext db)
,我会毫无问题地通过db
。但是,如果我ComplexViewModel(ApplicationDbContext db)
,我会收到null
。显然,我在启动时有services.AddDbContext<ApplicationDbContext>()
现在我明确地将所需的一切从Controller传递给ViewModel。但它觉得应该有更好的方法。
答案 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配置注册来使用它。没有其他代码更改:)