n8w*_*wrl 4 ioc-container inversion-of-control
我很难协调 IoC、接口和事件。让我们看看我是否可以在不写书的情况下解释这一点。
我刚刚开始使用 IoC,正在玩 Spring。我们有一个简单的数据层,它的构建早于 EF 或其他层。其中一个类是 DBProcedure,它具有一些方法和事件。
我创建了“真正的”DBProcedure 类实现的 IDBProcedure 接口。在 TDD 方式中,我希望能够将“真正的”DBProcedure 类替换为实现相同测试接口的另一个类。对我来说,这意味着 IDBProcedure 接口应该在与我的数据层不同的命名空间/项目中定义,对吗?
但是 DBProcedure 可以引发一些事件,并且这些事件提供自定义的 EventArgs 派生类。这是否意味着 EventArgs 类也需要在数据层之外定义?看起来似乎是为了让界面正常工作,但这似乎很糟糕,因为它会传播数据层?
另一方面,也许我有错误的想法 - 当我测试获取接口和事件定义时,即使我没有使用任何“真实”类,也可以包含数据层名称空间吗?
是的,您需要将接口及其依赖的所有类型移动到某个地方,因为您不希望接口模块依赖于实现。
通常的选择是两种选择之一
Impl ----> Api <---- client
Run Code Online (Sandbox Code Playgroud)
(实现依赖api,客户端依赖api,一切都在api模块中)
Impl ----> Api <----- client
\ | /
\ V /
------->Model<------
Run Code Online (Sandbox Code Playgroud)
这里每个人都依赖于一个通用的“模型”模块,其中包含枚举等。此版本的优点是您可以让多个 API 模块共享相同的公共枚举和其他工件。(因为你通常不希望 API 依赖于其他 API 模块)