存储库和服务层之间的区别?

 2023-02-17    251  

问题描述

在OOP设计模式中,存储库模式和服务层之间有什么区别?

我正在研究一个ASP.NET MVC 3应用程序,我正在尝试了解这些设计模式,但我的大脑只是没有得到它……还没有!!

存储库和服务层之间的区别?

推荐答案

存储库图层为您提供了额外的数据访问级别抽象.而不是写作

var context = new DatabaseContext();
return CreateObjectQuery<Type>().Where(t => t.ID == param).First();

要从数据库获取单个项目,请使用存储库接口

public interface IRepository<T>
{
    IQueryable<T> List();
    bool Create(T item);
    bool Delete(int id);
    T Get(int id);
    bool SaveChanges();
}

并调用Get(id).存储库层公开基本 crud 操作.

服务层公开业务逻辑,它使用存储库.示例服务看起来像:

public interface IUserService
{
    User GetByUserName(string userName);
    string GetUserNameByEmail(string email);
    bool EditBasicUserData(User user);
    User GetUserByID(int id);
    bool DeleteUser(int id);
    IQueryable<User> ListUsers();
    bool ChangePassword(string userName, string newPassword);
    bool SendPasswordReminder(string userName);
    bool RegisterNewUser(RegisterNewUserModel model);
}

虽然List()存储库方法返回所有用户,但IUSerService的ListUsers()只能返回那些,用户可以访问.

在ASP.NET MVC + EF + SQL Server中,我有这种通信流程:

视图服务层 – >存储库层 – > EF – > SQL Server

服务层 – >存储库层 – > ef 本部分在型号上运行.

视图服务层本部分在视图模型上运行.

编辑:

流/订单/键/5的流程示例(我们要查看特定客户端的订单):

public class OrderController
{
    private IOrderService _orderService;

    public OrderController(IOrderService orderService)
    {
        _orderService = orderService; // injected by IOC container
    }

    public ActionResult ByClient(int id)
    {
        var model = _orderService.GetByClient(id);
        return View(model); 
    }
}

这是订单服务的接口:

public interface IOrderService
{
    OrdersByClientViewModel GetByClient(int id);
}

此接口返回视图模型:

public class OrdersByClientViewModel
{
     CientViewModel Client { get; set; } //instead of ClientView, in simple project EF Client class could be used
     IEnumerable<OrderViewModel> Orders { get; set; }
}

这是接口实现.它使用模型类和存储库来创建视图模型:

public class OrderService : IOrderService
{
     IRepository<Client> _clientRepository;
     public OrderService(IRepository<Client> clientRepository)
     {
         _clientRepository = clientRepository; //injected
     }

     public OrdersByClientViewModel GetByClient(int id)
     {
         return _clientRepository.Get(id).Select(c => 
             new OrdersByClientViewModel 
             {
                 Cient = new ClientViewModel { ...init with values from c...}
                 Orders = c.Orders.Select(o => new OrderViewModel { ...init with values from o...}     
             }
         );
     }
}

其他推荐答案

作为carnotaurus表示,存储库负责将数据从存储格式映射到您的业务对象.它应该处理如何从存储和存储数据(删除,更新)读写数据.

服务层的目的另一方面是将业务逻辑封装到一个地方以促进代码重用和对顾虑的分离.这通常在练习时对我来说意味着在构建ASP.NET MVC网站时,我有这个结构

[controller]呼叫[服务]谁叫[存储库(IES)]

我发现的一个原则有用的是将逻辑保持在控制器和存储库中的最小值.

在控制器中,它是因为它有助于让我干燥.我需要在其他地方使用相同的过滤或逻辑,如果我将其放在控制器中,我无法重用它.

在存储库中,它是因为我希望能够更好地替换我的存储(或ORM).如果我在存储库中有逻辑,我需要在更改存储库时重写此逻辑.如果我的存储库仅返回IQueryable且服务返回过滤,则只需替换映射即可.

例如,我最近用EF4替换了我的几个LINQ-to-SQL存储库,而我留下的那些原则可以在几分钟内取代.我有一些逻辑,这是一个小时的问题.

其他推荐答案

接受的答案(和上升数百次)有一个重大缺陷.我想在评论中指出这一点,但它只会在30个评论中埋下在这里,这是如此指出.

我接管了那种建造的企业应用程序,我的初始反应是 WTH ?维修层中的ViewModels?我不想改变”公约”,因为多年的发展已经进入了它,所以我继续回归viewmodels.当我们开始使用WPF时,它会变成噩梦.我们(Devs团队)总是在说:哪个ViewModel?真实的(我们为WPF写的人)或服务一个?它们是为Web应用程序编写的,甚至已经有 IsReadOnly 标志,以禁用UI中的编辑.主要,主要缺陷和所有原因是一个单词: ViewModel !!

在你犯同样的错误之前,除了上面的故事之外,这里还有一些更多原因:

从服务层返回视图是一个巨大的否.这就像说:

  1. 如果您想使用这些服务,最好使用MVVM,这里是您需要使用的ViewModel. 哎哟!

  2. 服务正在制作假设,它们将在某处的UI中显示. 如果非UI应用程序使用,例如Web服务或Windows服务(如Windows服务)?

  3. 甚至不是真正的ViewModel. 真正的ViewModel具有可观察性,命令等,即只有糟糕名称的POCO. (见上面的故事为什么姓名很重要.)

  4. 消费应用程序更好是演示层(这层使用了ViewModel),更好地理解C#. 另一个哎哟!

拜托,不要这样做!

以上所述是小编给大家介绍的存储库和服务层之间的区别?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://www.77isp.com/post/34275.html

=========================================

https://www.77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。