我正在計劃使用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
,如果我輸入我的客戶可能需要通過CustomerService
和AddressService
。
如何在插件中注入這些服務(通過構造函數就像在控制器中一樣)?
難道你不能在你的插件註冊模塊?例如,在ninject中,您可以指定註冊插件依賴關係的NinjectModule。然後,在主要模塊中,您只需將所有模塊註冊到插件文件夾中,並且所有BL接口實現都將在插件中提供。 – eocron