我有一个使用ASP.NET MVC构建的网站,它使用存储库。
Controller使用存储库检索数据,如下所示:
IEnumerable<User> users = userRepository.GetAll();
当View需要更复杂的数据时,Controller会返回一个ViewModel,如:
public class UserDataViewModel
{
User User { get; set; }
Otherdata data { get; set; }
}
我的问题是 - 存储库可以返回ViewModel吗?像:
UserDataViewModel data = userRepository.GetComplexUserData(int userId);
或者,您可以将Viewmodel作为参考传递:
userRepository.SetComplexUserData(int userId, ref UserDataViewModel data);
或者存储库是否完全不知道ViewModels? 那么你应该构建一个与ViewModel相同的新类并在存储库中使用它吗?
答案 0 :(得分:1)
让我们看看Martin Fowler的存储库模式definition
使用a在域和数据映射层之间进行调解 用于访问域对象的类似集合的界面。
因此,这实际上意味着存储库中的ViewModel不存在。
ViewModel只是一个包装器,使View更容易使用您的域对象。模型不应该知道它呈现的方式
让我们说,你有模特:
public class User
{
public Guid Id { get; set; }
public string Name { get; set; }
}
在这种情况下,您的viewmodel看起来像
public class UserViewModel
{
readonly User _user;
readonly User _model;
public UserViewModel(User user, OtherData data)
{
_user = user;
}
public User User
{
get { return _user; }
}
public OtherData Data
{
get { return _data; }
}
[Required(ErrorMessage = "Id is requred")]
public Guid Id
{
get { return _user.Id; }
set { _user.Id = value; }
}
[Display(Name = "Full Name")]
[Required(ErrorMessage = "Name is required")]
public string Name
{
get { return _user.Name; }
set { _user.Name = value; }
}
// TODO: Add OtherData fields you want to expose to view
}
从存储库中获取数据
var user = userRepository.GetById(id);
var data = userRepository.GetComplexUserData(id);
var vm = new UserViewModel(user, data);
将数据保存到存储库(也可以拆分为2个语句并使用UnitOfWork)
userRepositoty.SetComplexUserData(vm.User, vm.Data);