【发布时间】:2016-08-23 08:53:18
【问题描述】:
我一直在阅读 Microsoft 的 NLayered Domain Driven Design Architecture 指南,我想将 MEF 实现为我的 DI 容器。
我想通过创建 3 个项目来测试 MEF:只有接口的 ContractProject。 ImplementationProject 具有使用 Export[typeof(Interface)] 注释实现此接口的类。还有一个控制台应用程序来测试它。
根据依赖注入原则,高层不应该引用低层,反之亦然。它们都应该引用一个抽象层(接口)。
我尝试应用它。控制台应用程序引用 ContractsProject, implementationProject 引用 ContractsProject。但是如果程序集中没有 ImplentationProject dll,MEF 找不到 EXPORT 类。我看过一个教程,他们手动将 dll 添加到 MainApp 的 bin 文件夹中。好消息是您不能通过动态避免“添加引用”来直接访问实现方法,但我认为这不是正确的做法,因为每次更改时我都必须手动添加 dll。使用 NLayered Domain Driven Design 架构应用程序时,我需要大量的 dll。
这是否意味着 MEF 不是依赖注入所需的正确工具? (本书使用Unity)
代码如下:
namespace Contracts
{
public interface ISampleContract
{
string DoSomething();
}
}
namespace Implementation
{
[Export(typeof(ISampleContract))]
public class Sample : ISampleContract
{
public string DoSomething()
{
return "I did something ";
}
}
}
程序:
namespace Console
{
class Program
{
[Import]
public ISampleContract sample { get; set; }
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
public void Run()
{
var catalog = new AggregateCatalog(
new AssemblyCatalog(Assembly.GetExecutingAssembly()),
new DirectoryCatalog("."));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
Console.WriteLine(sample.DoSomething());
Console.ReadKey();
}
}
}
如果我没有在主程序中引用实现 dll,ComposeParts() 事情会失败,因为它找不到与约束匹配的导出...有没有办法在不引用 dll 的情况下解决这个问题或应该我完全选择另一个 DI 工具?比如 Unity?
编辑 如果我在实施项目上配置构建后事件以将其 dll 复制到我的控制台 bin,它会起作用。我不确定这是否是一个好的解决方案?
copy /Y "$(TargetFileName)" "$(SolutionDir)Console\bin\Debug\$(ProjectName).dll"
【问题讨论】:
-
顺便说一句,我不确定 MEF 是否是控制容器反转的最佳选择...
-
我才刚刚开始意识到这一点。似乎 MEF 还没有提供 DI 容器的全部功能。
标签: .net dependency-injection domain-driven-design inversion-of-control mef