我特别喜欢DI / IoC和MEF。
我有一个Web应用程序,它有两种类型的部分(可能更有一天)由需要访问整个环境的接口定义。该应用程序有一个列表,其中包含每种类型的具体实现,由MEF组成。
环境包括:
如何将接口定义放在单独的程序集中,同时指定环境注入?
显然,我不能只引用主程序集,因为它需要引用契约程序集而我无法创建循环引用。
似乎我需要为每个环境类及其公开类型等创建一个接口......必须有更好的方法吗?!
也许我也错过了明显更大的缺陷,如果有人能为我指出的话?
答案 0 :(得分:10)
如果你想将你的抽象与他们的实现分离(总是一个有价值的目标),你应该在他们自己的程序集中定义这些抽象。
从实现方面来说,这很容易处理,因为你需要引用抽象来实现它们。无论你是否使用MEF,都无法解决这个问题,因为它一如既往:
[Import(typeof(IFoo))]
public class MyFoo : IFoo { }
但是,正如您所说,这意味着您无法从抽象库中引用组合根。但是,这是应该的,因为抽象不应该担心它们是如何组合的。
换句话说,您必须在抽象库之外实现依赖项的组合。一个很好的候选者是可执行文件本身,而你可以将所有具体实现保存在一个或单独的库中。
抽象库没有引用,而消费者和实现者都需要引用它,因此依赖图可能如下所示:
Composition Root --> Abstractions <-- Implementations
箭头表示参考。