【问题标题】:What type of data can a Repository return存储库可以返回什么类型的数据
【发布时间】:2015-04-16 03:19:22
【问题描述】:

我有一个网站,使用 ASP.NET MVC 构建,使用存储库。

控制器使用存储库检索数据,如下所示:

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 作为 ref 传递:

userRepository.SetComplexUserData(int userId, ref UserDataViewModel data);

或者存储库是否应该完全不知道 ViewModel? 然后您是否应该构建一个与 ViewModel 相同的新类并在存储库中使用它?

【问题讨论】:

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


    【解决方案1】:

    让我们看看 Martin Fowler 的存储库模式 definition

    在域和数据映射层之间使用 用于访问域对象的类集合接口。

    所以这实质上意味着视图模型在存储库中没有位置。

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

    【讨论】:

    • 所以要获取数据,我必须两次访问数据库?就我而言,我需要返回五个数据库表......最好在一个数据库调用中返回。
    • 你应该考虑一下OtherData与User的关系。也许 OtherData 是 User 的逻辑部分,它们应该总是在一起?无论如何,如果您想一次完成,您可以使用 Tuple 作为结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2017-03-27
    • 2016-03-26
    相关资源
    最近更新 更多