我最近发现了杰弗里·巴勒莫的洋葱建筑模式,并决定出于好奇心将其用于当前项目。之后我不得不用另一个(Ninject)替换我的IoC框架(Unity),因为它使我的项目完全无法使用它,我注意到我做出了正确的决定,因为我只需要更改我的一些部分应用程序,它仍然像一个魅力。
但是,我还没有想出在这种模式中某些与Entity Framework和IoC相关的接口属于哪个界面。假设我有一个用于数据库上下文的接口:
public interface IDatabaseContext : IDisposable {
IDbSet<T> Set<T>() where T: class;
}
这现在是域接口吗?还是基础设施界面?需要IDbSet&lt;&gt;'1类型的接口成员将接口与Entity Framework紧密耦合,但我需要一种方法将数据库上下文的瞬态实例注入存储库。 IoC甚至适合洋葱建筑吗?您如何看待这种结构:
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
答案 0 :(得分:5)
依赖注入(DI)非常适合洋葱架构; that's where you should end, if you correctly apply DI
接口应该由使用接口的客户端定义和拥有。正如Agile Principles, Patterns, and Practices解释的那样,“clients [...]拥有抽象接口”(第11章)。因此,任何定义像IDatabaseContext
这样以数据为中心的接口的尝试都迟早会引起问题,因为它违反了各种SOLID原则,如依赖性倒置原则或接口隔离原则。
相反,您的客户端代码应该定义他们需要的接口。然后,您始终可以使用Entity Framework 实现这些接口。