我使用this tutorial to create a Database model

我决定通过阅读Juwal Lowy对“Programming .NET Components”的引用来创建另一个抽象集,例如IRepositoryIFooService:



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

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关于它。虽然有点过时,但是是一个不错的起点。我应该尽快更新。

10-04 19:24