我使用this tutorial to create a Database model。
我决定通过阅读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
中创建一个Person.Common
:public interface IPersonRepository : IRepository<Person> {}
当我尝试将对
PersonApp.Persistence
的引用添加到PersonApp.Common
时,引发以下错误:但是,我真的很想为接口(interface)提供单独的程序集,并为 Entity Framework 提供另一个程序集。
如何将存储库接口(interface)移至另一个程序集?
另外,我希望将来能够使用to keep the database schema in sync with the EF Core model by preserving data。
我使用DatabaseFirst。预先感谢。任何帮助将不胜感激!
最佳答案
我将在这里成为被抛弃的人,并为您提供您可能不喜欢的答案,并且线程上的大多数其他人可能也不会。答案是...不要使用存储库。
几年前,当它是宇宙中最流行的东西时,我尝试了一下。我花了几个月的时间试图理解,实现和使用它。到目前为止,对于存储库,我仍然无法理解实现的好处与复杂性。最后,我停止尝试,并将其从我拥有的任何项目中删除。我再也没有回头。
我敢肯定有人会反对我的陈述,但这只是我的经验,我觉得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's 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 查询”进一步扩大了垂直切面。无耻的自我插件到my blog talking关于它。虽然有点过时,但是是一个不错的起点。我应该尽快更新。