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