2016-10-12 39 views
0

我正在計劃使用MEF爲我的導入插件實現插件體系結構。這些插件會將各種數據導入數據庫(例如客戶,地址,產品等)。在WebApi應用程序中使用MEF和DI

進口插件類看起來是這樣的:

public interface IImportPlugin 
{ 
    string Name { get; } 
    void Import(); 
} 

[Export(typeof(IImportPlugin))] 
public class ImportCustomers : IImportPlugin 
{ 
    private readonly ICustomerService customerService; 

    public string Name 
    { 
     get { this.GetType().Name; } 
    } 

    public ImportCustomers(ICustomerService _customerService) 
    { 
     customerService = _customerService; 
    } 

    public void Import() {} 
} 

然後我有一個控制器,它首先獲取所有輸入插件如下:

public IHttpActionResult GetImportPlugins() 
{ 
    var catalog = new AggregateCatalog(); 

    catalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin"))); 

    var directoryCatalog = new DirectoryCatalog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins")); 
    catalog.Catalogs.Add(directoryCatalog); 

    var container = new CompositionContainer(catalog); 
    container.ComposeParts(); 

    var list = container.GetExportedValues<IImportPlugin>().Select(x => x.Name); 
    return Ok(list); 
} 

進口插件需要引用我的Services總成因爲這是BL發生的地方。註冊我的服務與Autofac主要的WebAPI項目如下:

builder.RegisterAssemblyTypes(assemblies) 
    .Where(t => t.Name.EndsWith("Service")) 
    .AsImplementedInterfaces() 
    .InstancePerRequest(); 

是否有可能通過不同的服務,不同的輸入插件?

例如,如果我進口的產品我需要通過ProductService,如果我輸入我的客戶可能需要通過CustomerServiceAddressService

如何在插件中注入這些服務(通過構造函數就像在控制器中一樣)?

+0

難道你不能在你的插件註冊模塊?例如,在ninject中,您可以指定註冊插件依賴關係的NinjectModule。然後,在主要模塊中,您只需將所有模塊註冊到插件文件夾中,並且所有BL接口實現都將在插件中提供。 – eocron

回答

0

對於插件式的建築風格,你需要三樣東西:

  • 合同(basicaly組件只包含接口和簡單 對象withouth的BL)。這將用作插件的API。另外,在這裏你可以指定IImportPlugin接口。

  • 負責任的模塊將從某個文件夾或其他地方加載插件模塊。

  • 模塊在您創建的每個插件中,將您的插件註冊爲II容器內的IImportPlugin。

您可以循環像這樣註冊您的插件模塊:

builder.RegisterAssemblyModules(/*plugin 'Assembly' goes here*/); 

在你的插件組裝,在具體的模塊,您只需指定你的插件註冊:

public class MyPluginModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.Register<ImportCustomers>().As<IImportPlugin>(); 
    } 
} 

然後在插件實施ImportCustomer您可以使用從合同彙編(例如e您的ICustomerService接口)。如果你的系統爲你的插件註冊了依賴關係 - 它將會成功加載到DI容器中。

+0

我不想註冊使用DI的插件,因爲它們必須事先知道,它使用MEF破壞了插件體系結構的目的。 –

相關問題