首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >库模式的简单实现

库模式的简单实现
EN

Stack Overflow用户
提问于 2015-08-14 06:49:54
回答 3查看 416关注 0票数 2

我是直接使用ADO.NET与MVC 5,而不是实体框架。

我指的是这个示例来实现存储模式。

对于存储库模式的简单实现:

  1. 我将创建一个模型
  2. 我将创建一个带有CRUD方法声明的接口。
  3. 我将在数据访问层中创建一个类,它将实现上述接口,并具有CRUD方法实现。

我想知道为什么要使用接口?我不能像上面第(3)点那样直接使用类。

接口的作用是什么?

根据上面提到的三点,它是否正确地实现了存储模式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-14 10:12:56

在设计良好的代码中,您必须使用接口,而不是实现。它有好处。假设您有一个具有代码片段的类:

代码语言:javascript
复制
IBookRepository bookRepository;

public Book GetInterestingBook() {
  var book = bookRepository.getBooks().FirstOrDefault(x => x.IsInteresting);
  return book;
}

现在我将向你们展示一些好处:

  1. 通过使用接口,您可以通过依赖项注入隐式地创建bookRepository实例(尼尼姆,统一等等,有很多)。如果您决定将存储库实现从实体框架更改为NHibernate,则不需要对代码进行更改。只需将映射文件中的映射更改为用于IBookRepository NHibernateRepository而不是EFBookRepository。当然,NHibernateRepository也应该开发。
  2. 使用接口可以通过MockObjects实现伟大的单元测试。您只需要实现MockBookRepository并在注入时使用它。有许多Mock框架可以帮助您,例如Moq。
  3. 您可以在不更改代码的情况下动态切换存储库。例如,如果您的数据库是临时关闭的,但是您有另一个数据库可以处理新订单,例如,因为它们是关键的(我知道不好的例子)。在这种情况下,您可以检测到DB掉下来,并生成如下内容: currentRepository = temporaryOrdersOnlyRepository;

现在,您的代码继续运行,除了get数据和delete方法返回异常外,但是CreateNewOrder()方法将把订单保存到字符串文件中)

祝好运!

票数 2
EN

Stack Overflow用户

发布于 2015-08-14 17:49:39

这是一项服务

代码语言:javascript
复制
public interface IFoodEstablishmentService
{
    Task<int> AddAsync(FoodEstablishment oFoodEstablishment);
    Task<int> UpdateAsync(FoodEstablishment oFoodEstablishment);
}

这是我的正常实现

代码语言:javascript
复制
public class FoodEstablishmentService : IFoodEstablishmentService
{
    public async Task<int> AddAsync(FoodEstablishment oFoodEstablishment)
    {
       // Insert Operation
        return result;
    }

    public async Task<int> UpdateAsync(FoodEstablishment oFoodEstablishment)
    {
        // Update Logic
        return result;
    }
}

我就是这么用的

代码语言:javascript
复制
IFoodEstablishmentService oFoodEstablishmentService =  new FoodEstablishmentService();
oFoodEstablishmentService.AddAsync(oFoodEstablishment);

但是,如果我可能需要通过队列而不是直接将插入逻辑传递给服务器,等待insert操作完成,然后返回结果,而不是传递队列,然后队列工作人员处理这些操作,那该怎么办?所以,我没有破坏一切,而是实现了另一个具有相同接口的类。

代码语言:javascript
复制
public class FoodEstablishmentQueueService : IFoodEstablishmentService
{
    public async Task<int> AddAsync(FoodEstablishment oFoodEstablishment)
    {
       // Insert Queue Operation
        return result;
    }

    public async Task<int> UpdateAsync(FoodEstablishment oFoodEstablishment)
    {
        // Update Queue Logic
        return result;
    }
}

这就是我使用它的方式,它不是很容易就不破坏任何东西,并且使用DI容器,正如前面所述,答案甚至更好

代码语言:javascript
复制
IFoodEstablishmentService oFoodEstablishmentService =  new FoodEstablishmentQueueService();
oFoodEstablishmentService.AddAsync(oFoodEstablishment);

我想,不要选择最好的模式,而是从任何模式开始,然后慢慢地需要更多的东西,然后模式开始发挥作用,另外,对于大型应用程序来说,存储库模式或通用存储库模式可能不是理想的模式,因为选择逻辑超出了选择模型数据的范围。请搜索CQRS模式。

票数 1
EN

Stack Overflow用户

发布于 2015-08-15 20:34:54

那个教程太没用了。这只是EF的DbSet的包装。很坏的例子。存储库模式本身意味着您需要基于域需要设计一个适当的接口。通常你至少有三个需求:添加,获取,保存。但是,一切都取决于您的领域,这一点很重要:没有配方,这正是应用程序所需要的。

存储库实现只是整个业务对象的持久化/加载(其中业务对象是业务概念)。您已经选择了Ado.net (您应该选择一个micro,因为使用ado.net没有好处)来与数据库进行通信。好的,只需对db进行保存,查询db例程。

没有关于如何实现存储库的方法/规则。“硬”部分是设计界面。实现只是一个使用db的类(以任何您想要的方式)。

我们使用接口是因为,通常,回购的接口是域的一部分,而它的实现是持久化的一部分。这还允许多个存储库实现和简单的测试(通过模拟)。

顺便说一句,您必须理解存储库模式只是一个简单的原则。它可以以你想要的方式实现,没有一种‘正确’的方式。但是,需要“正确”的是接口设计,其方式是只使用业务对象,不泄露实现细节(如IQueryable)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32003926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档