查看模型應該是簡單的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,你只需創建一個名爲「DapperUserDataAccess
」的IUserDataAccess
的新實現,並使用該配置註冊即可。沒有其他代碼更改:)
我建議您的ViewModels不包含任何行爲,並且將所有行爲都移至自定義服務。這應該可以解決你的問題。 –