我有一个网站,使用ASP.NET MVC构建,使用存储库。
控制器使用如下存储库检索数据:
IEnumerable<User> users = userRepository.GetAll();
当视图需要更复杂的数据时,控制器返回ViewModel,如:
public class UserDataViewModel
{
User User { get; set; }
Otherdata data { get; set; }
}
我的问题是-存储库是否可以返回ViewModel?类似:
UserDataViewModel data = userRepository.GetComplexUserData(int userId);
或者,您可以将Viewmodel作为ref:传入吗
userRepository.SetComplexUserData(int userId, ref UserDataViewModel data);
还是存储库应该完全不知道ViewModels?然后,您是否应该构建一个与ViewModel相同的新类,并在存储库中使用它?
让我们看看Martin Fowler 对存储库模式的定义
使用类似集合的接口,用于访问域对象。
因此,这本质上意味着存储库中没有ViewModels的位置。
ViewModel只是一个包装器,它使View更容易处理域对象。模型不应该知道其呈现的方式
比方说,你有型号:
public class User
{
public Guid Id { get; set; }
public string Name { get; set; }
}
在这种情况下,您的视图模型将看起来像
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);