DBContext、Repository、UnitOfWork应该在哪一层?
Which layer should DBContext, Repository, and UnitOfWork be in?
我想在项目中使用分层架构和 EF、存储库和 UoW 模式。
DBContext、Repository、UnitOfWork应该在哪一层?
DAL 还是 BLL?
DAL 是数据访问层的缩写。 DbContext、repositories 和 Unit Of Work 与处理数据有关,因此您绝对应该将它们放在 DAL 中。
我会将您的 DbContext 实现放在您的 DAL(数据访问层)中。您可能对此有不同的看法,但我不会实施存储库或工作单元模式。从技术上讲,DBContext 是工作单元,而 IDbSet 是存储库。通过实现自己的抽象,您将在抽象之上添加抽象。
"Should" 在这里可能不是正确的词,因为关于这个主题有很多观点。
如果你想在书中实现这些模式,我会从 ASP.NET 人那里查看这个 link:
https://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
但实际上我已经开始这样分层了:
控制器/逻辑 <- 创建和转换业务逻辑和边界对象的地方。
存储库 <- 与持久化和转换实体和查询对象相关的逻辑
Store <- 存储机制的实际实现所在的位置。这是在接口后面抽象出来的。
这种方式利用了这样一个事实,即业务逻辑和存储库逻辑都是可测试的、解耦的,并且可以自由使用任何机制来实现持久性——或缺乏持久性。应用程序的其余部分对此一无所知。
这当然也适用于其他模式,这只是我的看法。
DbContext 不应该越过 DAL 的边界,如果你想把你的存储库或工作单元放在那里,你可以随意,只是不要让它们向上泄露它们的细节或依赖项。在我看来,DbContext 的范围应该尽可能窄,以尽可能保持干净——你永远不知道那个上下文在哪里……请戴上保护装置!但开个玩笑,如果你有一个异步的、多线程的、多节点的、大的应用程序,到处使用这些 DbContexts 传递它们,你将遇到一般的并发和数据竞争问题。
我喜欢做的是从一个 InMemory 存储开始,我将其注入到我的控制器中。一旦该商店开始为多个实体提供服务,持久性逻辑就会变得越来越复杂——我将其重构为一个顶部有存储库的商店。一旦我的所有测试都通过并且我让它按照我想要的方式工作,我就开始创建该商店的基于数据库或文件系统的实现。
在这里再次表达我的意见,因为这是一个非常笼统的问题,"true" 答案很少,只有很多意见。
关于这个的大多数意见都是有效的,它们只是有不同的长处和短处,重要的部分是弄清楚你需要哪些长处,以及你将如何克服这些短处。
您的存储库应该有一个对 DbSet<T>
对象的引用,一旦您从一个或多个存储库中添加、更新或删除,您应该从 UnitOfWork
调用 SaveChanges
。因此,您应该将 DbContext
放入工作单元实现中。
我想在项目中使用分层架构和 EF、存储库和 UoW 模式。
DBContext、Repository、UnitOfWork应该在哪一层?
DAL 还是 BLL?
DAL 是数据访问层的缩写。 DbContext、repositories 和 Unit Of Work 与处理数据有关,因此您绝对应该将它们放在 DAL 中。
我会将您的 DbContext 实现放在您的 DAL(数据访问层)中。您可能对此有不同的看法,但我不会实施存储库或工作单元模式。从技术上讲,DBContext 是工作单元,而 IDbSet 是存储库。通过实现自己的抽象,您将在抽象之上添加抽象。
"Should" 在这里可能不是正确的词,因为关于这个主题有很多观点。 如果你想在书中实现这些模式,我会从 ASP.NET 人那里查看这个 link: https://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
但实际上我已经开始这样分层了:
控制器/逻辑 <- 创建和转换业务逻辑和边界对象的地方。
存储库 <- 与持久化和转换实体和查询对象相关的逻辑
Store <- 存储机制的实际实现所在的位置。这是在接口后面抽象出来的。
这种方式利用了这样一个事实,即业务逻辑和存储库逻辑都是可测试的、解耦的,并且可以自由使用任何机制来实现持久性——或缺乏持久性。应用程序的其余部分对此一无所知。
这当然也适用于其他模式,这只是我的看法。
DbContext 不应该越过 DAL 的边界,如果你想把你的存储库或工作单元放在那里,你可以随意,只是不要让它们向上泄露它们的细节或依赖项。在我看来,DbContext 的范围应该尽可能窄,以尽可能保持干净——你永远不知道那个上下文在哪里……请戴上保护装置!但开个玩笑,如果你有一个异步的、多线程的、多节点的、大的应用程序,到处使用这些 DbContexts 传递它们,你将遇到一般的并发和数据竞争问题。
我喜欢做的是从一个 InMemory 存储开始,我将其注入到我的控制器中。一旦该商店开始为多个实体提供服务,持久性逻辑就会变得越来越复杂——我将其重构为一个顶部有存储库的商店。一旦我的所有测试都通过并且我让它按照我想要的方式工作,我就开始创建该商店的基于数据库或文件系统的实现。
在这里再次表达我的意见,因为这是一个非常笼统的问题,"true" 答案很少,只有很多意见。
关于这个的大多数意见都是有效的,它们只是有不同的长处和短处,重要的部分是弄清楚你需要哪些长处,以及你将如何克服这些短处。
您的存储库应该有一个对 DbSet<T>
对象的引用,一旦您从一个或多个存储库中添加、更新或删除,您应该从 UnitOfWork
调用 SaveChanges
。因此,您应该将 DbContext
放入工作单元实现中。