c# - 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.cs
in Person.Common
:
public interface IPersonRepository : IRepository<Person> {}
当我尝试添加对PersonApp.Persistence
into的引用时,会引发以下错误PersonApp.Common
:
无法添加对“PersonApp.Persistence”的引用。将此项目添加为引用会导致循环依赖。
但是,我真的很想有单独的接口程序集和实体框架的另一个程序集。
如何将存储库接口移动到另一个程序集?
此外,我希望将来能够通过保留 data 使数据库架构与 EF Core 模型保持同步。
我使用数据库优先。预先感谢。任何帮助将不胜感激!
解决方案
我将成为这里的弃儿,给你一个你可能不喜欢的答案,可能线程上的大多数其他人也不会。答案是……不要使用存储库。
几年前,当它是宇宙中最受欢迎的东西时,我尝试过。我花了几个月的时间试图理解、实施和使用它。直到今天,我仍然无法理解在存储库方面实现的好处与复杂性。最后,我停止尝试并将它们从我拥有的任何项目中删除。我从未回头。
我相信有人会质疑我的说法,但这只是我的经验,我觉得 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将垂直切片更进一步。无耻的自我插入我的博客谈论它。虽然有点过时,但是一个不错的起点。我应该尽快更新它。
推荐阅读
- mysql - 如何将 INSERT INTO -> ON DUPLICATE KEY UPDATE 函数的值放入 SELECT 中?
- javascript - 如何更改对象数组中的列位置
- amazon-web-services - Apache Solr 和 AWS Comprehend Machine Learning 用于排序和分类
- r - ggplot中的两个不同颜色键
- sql - 如何根据 Where 条件选择 MAX 值
- c++ - Swift 的 [weak self] 替代 C++
- sql - 如何使用实体框架核心定义区分大小写的唯一性索引?
- reactjs - Enzyme+React 期望组件字符串 - 无法解析选择器
- mysql - 使用逗号分隔列表在列中查找逗号分隔值
- kernel - 恢复按钮不起作用 - Amlogic android 盒子