存储库可以返回什么类型的数据



我有一个网站,使用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);

相关内容

  • 没有找到相关文章

最新更新