我一直在閱讀Microsoft的NLayered域驅動設計體系結構指南書,我想實現MEF作爲我的DI容器。MEF&N域分層驅動設計體系結構的正確解耦
我想通過創建3個項目來測試MEF:只有接口的ContractProject。 ImplementationProject,它具有用Export [typeof(Interface)]註釋實現此接口的類。和一個控制檯應用程序來測試這個。
根據依賴注入原則,高層不應該引用低層,反之亦然。他們都應該引用一個抽象層(接口)。
我試過應用這個。控制檯應用程序引用ContractsProject,而implementationProject引用ContractsProject。但是,如果程序集中沒有ImplentationProject dll,MEF就無法找到EXPORT類。我看過一個教程,他們手動將dll添加到MainApp的bin文件夾中。好處是你不能直接訪問實現方法,避免動態添加引用,但我認爲這是不對的,因爲我必須在每次更改時手動添加dll。並且使用NLayered Domain Driven Design體系結構應用程序,我將需要大量dll。
這是否意味着MEF不是我需要依賴注入的正確工具? (書中使用統一)
下面是代碼:
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容器的全部功能。 – YL1
然而從未... –