Dependency injection 机电工程署;单独的接口组件通向;“每个类的接口”;

Dependency injection 机电工程署;单独的接口组件通向;“每个类的接口”;,dependency-injection,inversion-of-control,interface,mef,Dependency Injection,Inversion Of Control,Interface,Mef,我的脚被DI/IoC和MEF弄湿了 我有一个web应用程序,它有两种类型的部分(将来可能会更多),由需要访问整个环境的接口定义。应用程序有一个列表,其中包含每种类型的具体实现,由MEF组成 环境包括: 几个存储库 当前申请请求 渲染引擎 导航引擎 加上一些静态实用程序类 如何将接口定义放在单独的程序集中,同时指定环境注入 显然,我不能只引用主程序集,因为它需要引用合同程序集,我不能创建循环引用 似乎我需要为每个环境类以及它们的公共可用类型等创建一个接口。。。一定有更好的办法 如果有人能为我指

我的脚被DI/IoC和MEF弄湿了

我有一个web应用程序,它有两种类型的部分(将来可能会更多),由需要访问整个环境的接口定义。应用程序有一个列表,其中包含每种类型的具体实现,由MEF组成

环境包括:

  • 几个存储库
  • 当前申请请求
  • 渲染引擎
  • 导航引擎
  • 加上一些静态实用程序类
如何将接口定义放在单独的程序集中,同时指定环境注入

显然,我不能只引用主程序集,因为它需要引用合同程序集,我不能创建循环引用

似乎我需要为每个环境类以及它们的公共可用类型等创建一个接口。。。一定有更好的办法


如果有人能为我指出的话,也许我也忽略了这里明显的更大的缺陷?

如果您想将抽象与它们的实现分离(始终是一个有价值的目标),您应该在它们自己的程序集中定义这些抽象

从实现方面来说,这很容易处理,因为您需要引用抽象来实现它们。无论您是否使用MEF,都无法解决这一问题,因此始终如此:

[Import(typeof(IFoo))]
public class MyFoo : IFoo { }
然而,正如您所说,这意味着您不能从抽象库中引用您的合成根。然而,这是应该的,因为抽象不应该担心它们是如何组成的

换句话说,您必须在抽象库之外实现依赖项的组合。一个很好的候选对象是可执行文件本身,而您可以将所有具体实现保存在一个或单独的库中

抽象库将没有引用,而使用者和实现者都需要引用它,因此依赖关系图可能如下所示:

Composition Root --> Abstractions <-- Implementations

compositionroot-->抽象“不能从抽象库引用你的合成根”-这是我的目标,也是我困惑的根源。如果我的抽象有一个类型为“Engine”的属性,它是在我的实现库中定义和实现的,那么我是否也需要在抽象库中为这个类型创建一个接口“IEngine”?现在,如果我需要引用多个类型,每个类型都有自己的依赖项,那么我需要将所有类型抽象到抽象库中,不是吗?是的,这是正确的。所有这些额外的接口看起来都超出了开销,但实际上每个接口都是一个接缝,在这里您可以将实现者和使用者解耦。最终的结果是一个松散耦合的系统。好处可能不是很明显,但一旦你开始体验到使用和公开抽象而不是具体类型的能力,你就再也不想回头了:)谢谢,所以我认为太多了,实际上是非常好的,是需要的!阿门-一旦我发现了抽象和接口的秘密,我就到处使用它们。我还没有找到一个组合根的样本。我看到很多帖子都写着“在你的作文词根”等等,但从来没有任何例子或指导给那些正在学习DI和以前从未见过CR的人。