我特别熟悉 DI/IoC 和 MEF。
我有一个 Web 应用程序,它有两种类型的部分(也许有一天会更多),这些部分由需要访问整个环境的接口定义。该应用程序有一个由 MEF 组成的列表,其中包含每种类型的具体实现。
环境包括:
- 几个存储库
- 当前的申请请求
- 渲染引擎
- 导航引擎
- 加上一些静态实用程序类
如何将接口定义放在单独的程序集中,同时指定环境注入?
显然,我不能只引用主程序集,因为它需要引用合同程序集,并且我无法创建循环引用。
看来我需要为每个环境类及其公开可用的类型等创建一个接口...必须有更好的方法吗?!
也许我还错过了这里明显的更大缺陷,如果有人能为我指出吗?
如果您想将抽象与实现分离(始终是一个有价值的目标),则应该在它们自己的程序集中定义这些抽象。
从实现方面来看,这很容易处理,因为您需要引用抽象来实现它们。无论你是否使用 MEF,都没有办法解决这个问题,所以一直都是这样:
[Import(typeof(IFoo))]
public class MyFoo : IFoo { }
但是,正如您所说,这意味着您无法引用您的成分根来自抽象库。然而,这是应该的,因为抽象不应该担心它们是如何组合的。
换句话说,您必须在抽象库之外实现依赖项的组合。可执行文件本身是一个很好的选择,而您可以将所有具体实现保存在一个或单独的库中。
抽象库将没有引用,而消费者和实现者都需要引用它,因此依赖关系图可能如下所示:
Composition Root --> Abstractions <-- Implementations
其中箭头表示参考。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)