2016-10-12 4 views
0

Я планирую использовать 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.

Как я могу вставлять эти сервисы внутри плагинов (через их конструкторы, как и в контроллере)?

+0

Не можете ли вы зарегистрировать модули в своих плагинах? Например, в ninject вы можете указать NinjectModule, в котором вы регистрируете свой плагин depenedncies. Затем в ваших основных модулях вы просто регистрируете все модули в папке плагина, и все ваши реализации интерфейсов BL будут доступны внутри плагинов. – eocron

ответ

0

Для плагинов типа архитектуры, нужны три вещи:

  • контракты (basicaly сборка, содержащая только интерфейсы и простые объекты withouth BL). Это будет использоваться как API для ваших плагинов. Кроме того, здесь вы можете указать интерфейс IImportPlugin.

  • Модуль, который несет ответственность за загрузку модулей плагинов из какой-либо папки или из другого места.

  • Модуль в каждом плагине, который вы создаете, для регистрации вашего плагина как IImportPlugin внутри контейнера DI.

Вы можете зарегистрировать свои модули плагинов, как это в цикле:

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

В вашей плагин сборки, в данном модуле, необходимо указать только регистрацию плагина:

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

Тогда в реализация плагина ImportCustomer Вы можете использовать все: от Контракт сборка (для примера e your Интерфейс ICustomerService). И если ваша система зарегистрировала dependecies для вашего плагина - она ​​будет успешно загружаться в контейнер DI.

+0

Я не хочу регистрировать плагины с помощью DI, потому что они должны быть известны заранее, и это поражает цель архитектуры плагина с использованием MEF. –

 Смежные вопросы

  • Нет связанных вопросов^_^