C# EntityFramework和IoC接口在洋葱架构中属于哪里?
我最近发现了Jeffrey Palermo的Onion架构模式,出于好奇,我决定将其用于当前的项目。在我不得不用另一个IoC框架(Unity)替换IoC框架(Ninject)之后,因为一个bug使它完全无法用于我的项目,我注意到我做出了正确的决定,因为我只需更改应用程序中的几个部分,它仍然运行得很好 然而,我还没有弄清楚在这种模式中,与实体框架和IoC相关的某些接口属于何处。假设我的数据库上下文有一个接口:C# EntityFramework和IoC接口在洋葱架构中属于哪里?,c#,design-patterns,dependency-injection,domain-driven-design,inversion-of-control,C#,Design Patterns,Dependency Injection,Domain Driven Design,Inversion Of Control,我最近发现了Jeffrey Palermo的Onion架构模式,出于好奇,我决定将其用于当前的项目。在我不得不用另一个IoC框架(Unity)替换IoC框架(Ninject)之后,因为一个bug使它完全无法用于我的项目,我注意到我做出了正确的决定,因为我只需更改应用程序中的几个部分,它仍然运行得很好 然而,我还没有弄清楚在这种模式中,与实体框架和IoC相关的某些接口属于何处。假设我的数据库上下文有一个接口: public interface IDatabaseContext : IDisposa
public interface IDatabaseContext : IDisposable {
IDbSet<T> Set<T>() where T: class;
}
依赖注入(DI)非常适合洋葱架构
接口应由使用接口的客户端定义和拥有。如前所述,“客户端[…]拥有抽象接口”(第11章)。因此,任何试图定义像IDatabaseContext
这样以数据为中心的接口的尝试迟早都会导致问题,因为它违反了各种可靠的原则,如依赖倒置原则或接口分离原则
相反,客户端代码应该定义它们所需的接口。然后您就可以使用实体框架实现这些接口。只是一个没有引用的观点,但数据库上下文对我来说确实像是基础设施。我认为域应该只针对(注入的)存储库接口工作,甚至不知道存储库在哪里查找/存储数据。存储库在其实现中很可能有一个注入的数据库上下文,但域不应该暴露于该细节。
MyProject.Domain
- Entities
- MyEntity.cs
MyProject.Domain.Interfaces
- IDatabaseContext.cs // that doesn't fit here, right?
- IMyEntityRepository.cs
MyProject.Infrastructure
- Repositories
- MyEntityRepository.cs
- DatabaseContext.cs
- Migrations
...
MyProject.Web
- ... // web stuff
- NancyBootstrapper.cs
MyProject.Application
- Services
- ISnmpClientService.cs
- SnmpClientService.cs
MyProject.Server
- KernelHelper.cs
- IKernelResolver.cs