Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 存储库模式的简单实现_Asp.net_Asp.net Mvc_Design Patterns_Asp.net Mvc 5_Repository Pattern - Fatal编程技术网

Asp.net 存储库模式的简单实现

Asp.net 存储库模式的简单实现,asp.net,asp.net-mvc,design-patterns,asp.net-mvc-5,repository-pattern,Asp.net,Asp.net Mvc,Design Patterns,Asp.net Mvc 5,Repository Pattern,我将ADO.NET直接用于MVC 5,而不是实体框架 我指的是实现存储库模式 对于存储库模式的简单实现: 我将创建一个模型 我将创建一个带有CRUD方法声明的接口 我将在数据访问层中创建一个类,该类将实现上述接口,并具有CRUD方法实现 我想知道为什么使用接口?根据上面第3点,我不能直接使用类 接口的作用是什么 根据上面提到的三点,它是存储库模式的正确实现吗?在设计良好的代码中,您必须使用接口,而不是实现。它有好处。假设您有一个带有代码片段的类: IBookRepository bookRepo

我将ADO.NET直接用于MVC 5,而不是实体框架

我指的是实现存储库模式

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

我将创建一个模型 我将创建一个带有CRUD方法声明的接口 我将在数据访问层中创建一个类,该类将实现上述接口,并具有CRUD方法实现 我想知道为什么使用接口?根据上面第3点,我不能直接使用类

接口的作用是什么


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

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

IBookRepository bookRepository;

public Book GetInterestingBook() {
  var book = bookRepository.getBooks().FirstOrDefault(x => x.IsInteresting);
  return book;
}
现在,我将向您展示一些好处:

使用接口可以通过依赖注入Ninject、Unity等隐式地创建bookRepository实例。如果您决定将存储库实现从实体框架更改为NHibernate,则无需对代码进行更改。只需将映射文件中的映射更改为用于IBookRepository nhibernaterpository而不是EFBookRepository。当然,NHibernateRepository也应该开发

使用接口可以通过MockObjects实现出色的单元测试。您只需要实现MockBookRepository并在注入时使用它。有许多模拟框架可以帮助您使用它,例如Moq

您可以在不更改代码的情况下动态切换存储库。例如,如果您的数据库暂时关闭,但您有另一个数据库可以处理新订单,例如,因为它们是关键的坏例子,我知道。在这种情况下,您会检测到DB下降,并做出如下操作:

currentRepository=temporaryOrdersOnlyRepository

现在代码继续运行,除了get data和delete方法返回异常,但CreateNewOrder方法将把订单保存到字符串文件中

祝你好运

这里有一个服务

public interface IFoodEstablishmentService
{
    Task<int> AddAsync(FoodEstablishment oFoodEstablishment);
    Task<int> UpdateAsync(FoodEstablishment oFoodEstablishment);
}
但等一下,如果我可能需要通过队列而不是直接向服务器传递插入逻辑,等待插入操作完成然后返回结果,而不是传递队列,然后队列工作者处理这些操作,该怎么办? 因此,我没有把一切都搞糟,而是用相同的接口实现了另一个类

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

我猜,不要选择最佳模式,而是从任何模式开始,然后慢慢地,您将需要更多的东西,然后模式开始发挥作用。此外,存储库模式或通用存储库模式可能不是大型应用程序的理想模式,因为选择逻辑不仅仅是选择模型数据。请搜索CQRS模式。

该教程毫无用处。它只是EF数据库集上的一个包装器。非常糟糕的例子。存储库模式本身意味着您需要根据域需求设计适当的接口。通常你至少有3个需求:添加、获取、保存。但一切都取决于你的域名,这很重要:没有配方,它只是应用程序需要的

存储库实现只是整个业务对象的持久化/加载,其中业务对象是一个业务概念。您选择了Ado.net,您应该选择micro Orm,因为使用Ado.net与db通信没有任何好处。好的,只需保存到db,查询db例程

没有关于如何实现存储库的配方/规则。“硬”部分是设计接口。该实现只是一个类,它以您想要的任何方式使用db

我们使用接口是因为,通常,repo的接口是域的一部分,而它的实现是持久性的一部分。这还允许多个存储库实现,并允许通过模拟轻松进行测试


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

本系列将帮助您更好地理解它:一些原因包括-以便您可以对应用程序进行单元测试,因此,您可以使用DI框架将存储库注入控制器,如Ninject@StephenMuecke我没有使用DI。您能举例说明如何使用DI进行注入吗?或者提供任何链接。一旦你意识到它的好处,你很快就会开始使用它:这个主题太大,无法在这里涵盖,但要从它开始
IFoodEstablishmentService oFoodEstablishmentService =  new FoodEstablishmentService();
oFoodEstablishmentService.AddAsync(oFoodEstablishment);
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;
    }
}
IFoodEstablishmentService oFoodEstablishmentService =  new FoodEstablishmentQueueService();
oFoodEstablishmentService.AddAsync(oFoodEstablishment);