Я планирую использовать MEF для реализации архитектуры плагина для моих модулей импорта. Эти плагины будут импортировать различные данные в db (например, клиенты, адреса, продукты и т. Д.).Использование MEF с DI в приложении WebApi
Класс импорта плагина выглядит следующим образом:
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. Зарегистрировать свои услуги в главном WebAPI проекта с Autofac следующим образом:
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerRequest();
Можно ли передавать различные услуги различным импорта плагинов?
Например, если я импортировать продукты мне нужно пройти ProductService
, и если я импортировать клиентов, я, возможно, придется пройти CustomerService
и AddressService
.
Как я могу вставлять эти сервисы внутри плагинов (через их конструкторы, как и в контроллере)?
Не можете ли вы зарегистрировать модули в своих плагинах? Например, в ninject вы можете указать NinjectModule, в котором вы регистрируете свой плагин depenedncies. Затем в ваших основных модулях вы просто регистрируете все модули в папке плагина, и все ваши реализации интерфейсов BL будут доступны внутри плагинов. – eocron