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

时间:2015-02-15 15:05:51

标签: c# asp.net-mvc model-view-controller viewmodel repository-pattern

我有一个使用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相同的新类并在存储库中使用它吗?

1 个答案:

答案 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);