首页 > 解决方案 > EF Core,数据库优先。如何将通用存储库接口移动到另一个程序集?

问题描述

我使用本教程来创建一个数据库模型

我决定通过阅读 Juwal Lowy 的“Programming .NET Components”这句话来创建另一个抽象程序集IRepository,例如:IFooService

因为接口可以由多个组件实现,所以最好将它们放在与实现组件分开的程序集中。

我的解决方案结构可能如下所示:

PersonsApp.Solution
--PersonsApp.WebUI
   -- Controllers (PersonController)
--PersonApp.Common
   --Core folder
      -IGenericRepository.cs (Abstraction)
      -IUnitOfWork.cs (Abstraction)  
   --Repositories folder
      -IPersonRepository.cs (Abstraction)
--PersonApp.Persistence  
  --Infrastructure folder
      -DbDactory.cs (Implementation)
      -Disposable.cs (Implementation)
      -IDbFactory.cs (Abstraction)
      -RepositoryBase.cs (Abstraction)
  --Models folder(Here we have DbContext, EF models (Implementation))      
      -Person.cs (Implementation)
      -PersonContext.cs (Implementation)
  --Repositories folder
      -PersonRepository.cs (Implementation)

但是,PersonApp.Persistence项目有一个参考PersonApp.Common。但我的项目PersonApp.Common也需要参考,PersonApp.Persistence因为我想创建一个IPersonRepository.csin Person.Common

public interface IPersonRepository : IRepository<Person> {}

当我尝试添加对PersonApp.Persistenceinto的引用时,会引发以下错误PersonApp.Common

无法添加对“PersonApp.Persistence”的引用。将此项目添加为引用会导致循环依赖。

但是,我真的很想有单独的接口程序集和实体框架的另一个程序集。

如何将存储库接口移动到另一个程序集?

此外,我希望将来能够通过保留 data 使数据库架构与 EF Core 模型保持同步

我使用数据库优先。预先感谢。任何帮助将不胜感激!

标签: c#asp.net-coreentity-framework-corerepository-patternef-database-first

解决方案


我将成为这里的弃儿,给你一个你可能不喜欢的答案,可能线程上的大多数其他人也不会。答案是……不要使用存储库。

几年前,当它是宇宙中最受欢迎的东西时,我尝试过。我花了几个月的时间试图理解、实施和使用它。直到今天,我仍然无法理解在存储库方面实现的好处与复杂性。最后,我停止尝试并将它们从我拥有的任何项目中删除。我从未回头。

我相信有人会质疑我的说法,但这只是我的经验,我觉得 OP 在我的发展历史上正在走上黑暗时期的道路。

至于你的项目结构,我建议如下:

PersonsApp.Solution
-- PersonsApp (optional)
   -- Extensions/ (any root-level extensions you want available to the other projects)
-- PersonsApp.Data
   -- references PersonsApp
   -- Configurations/ (contains all IEntityTypeConfiguration<T> for your POCOs)
   -- Models/ (contains all of your POCOs)
   -- DbContext.cs
-- PersonsApp.Web
   -- references PersonsApp and PersonsApp.Data
   -- Extensions/ (DbContext extensions to project data the same way you would with a repository, without the repository and with less code)
   -- ??? (your controllers, views, etc to display your app to your users)

这现在解决了您的循环依赖。

我还建议您使用 MediatR研究Jimmy Bogard 的 Vertical Slices Architecture 。当我第一次了解它时,它让我大吃一惊,与过于复杂的 DDD 架构不同,使用它真是太棒了。

在我的情况下,PersonsApp.Web结构如下所示:

-- PersonsApp.Web
   -- Features/ (all vertical slices)
   -- Resources/ (all scripts and styles that will be compiled by Gulp into the wwwroot folder)
   -- Program.cs
   -- Startup.cs

我使用 AutoMapper和Entity Framework Plus 的 Future Queries将垂直切片更进一步。无耻的自我插入我的博客谈论它。虽然有点过时,但是一个不错的起点。我应该尽快更新它。


推荐阅读