我是直接使用ADO.NET与MVC 5,而不是实体框架。
我指的是这个示例来实现存储模式。
对于存储库模式的简单实现:
我想知道为什么要使用接口?我不能像上面第(3)点那样直接使用类。
接口的作用是什么?
根据上面提到的三点,它是否正确地实现了存储模式?
发布于 2015-08-14 10:12:56
在设计良好的代码中,您必须使用接口,而不是实现。它有好处。假设您有一个具有代码片段的类:
IBookRepository bookRepository;
public Book GetInterestingBook() {
var book = bookRepository.getBooks().FirstOrDefault(x => x.IsInteresting);
return book;
}现在我将向你们展示一些好处:
现在,您的代码继续运行,除了get数据和delete方法返回异常外,但是CreateNewOrder()方法将把订单保存到字符串文件中)
祝好运!
发布于 2015-08-14 17:49:39
这是一项服务
public interface IFoodEstablishmentService
{
Task<int> AddAsync(FoodEstablishment oFoodEstablishment);
Task<int> UpdateAsync(FoodEstablishment oFoodEstablishment);
}这是我的正常实现
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;
}
}我就是这么用的
IFoodEstablishmentService oFoodEstablishmentService = new FoodEstablishmentService();
oFoodEstablishmentService.AddAsync(oFoodEstablishment);但是,如果我可能需要通过队列而不是直接将插入逻辑传递给服务器,等待insert操作完成,然后返回结果,而不是传递队列,然后队列工作人员处理这些操作,那该怎么办?所以,我没有破坏一切,而是实现了另一个具有相同接口的类。
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容器,正如前面所述,答案甚至更好
IFoodEstablishmentService oFoodEstablishmentService = new FoodEstablishmentQueueService();
oFoodEstablishmentService.AddAsync(oFoodEstablishment);我想,不要选择最好的模式,而是从任何模式开始,然后慢慢地需要更多的东西,然后模式开始发挥作用,另外,对于大型应用程序来说,存储库模式或通用存储库模式可能不是理想的模式,因为选择逻辑超出了选择模型数据的范围。请搜索CQRS模式。
发布于 2015-08-15 20:34:54
那个教程太没用了。这只是EF的DbSet的包装。很坏的例子。存储库模式本身意味着您需要基于域需要设计一个适当的接口。通常你至少有三个需求:添加,获取,保存。但是,一切都取决于您的领域,这一点很重要:没有配方,这正是应用程序所需要的。
存储库实现只是整个业务对象的持久化/加载(其中业务对象是业务概念)。您已经选择了Ado.net (您应该选择一个micro,因为使用ado.net没有好处)来与数据库进行通信。好的,只需对db进行保存,查询db例程。
没有关于如何实现存储库的方法/规则。“硬”部分是设计界面。实现只是一个使用db的类(以任何您想要的方式)。
我们使用接口是因为,通常,回购的接口是域的一部分,而它的实现是持久化的一部分。这还允许多个存储库实现和简单的测试(通过模拟)。
顺便说一句,您必须理解存储库模式只是一个简单的原则。它可以以你想要的方式实现,没有一种‘正确’的方式。但是,需要“正确”的是接口设计,其方式是只使用业务对象,不泄露实现细节(如IQueryable)。
https://stackoverflow.com/questions/32003926
复制相似问题