В моем использовании MEF у меня есть набор импортов, которые я хочу сделать доступными во многих других частях моего кода. Что-то типа:
[Export (typeof (IBarProvider))]
class MyBarFactory : IBarPovider
{
[Import]
public IFoo1Service IFoo1Service { get; set; }
[Import]
public IFoo2Service IFoo2Service { get; set; }
[Import]
public IFoo3Service IFoo3Service { get; set; }
[Import]
public IFoo4Service IFoo4Service { get; set; }
[Import]
public IFoo5Service IFoo5Service { get; set; }
public IBar CreateBar()
{
return new BarImplementation(/* want to pass the imported services here */);
}
}
class BarImplementation : IBar
{
readonly zib zib;
public BarImplementation(/* ... */)
{
this.zib = new Zib(/* pass services here, too */);
}
}
Я мог бы передать каждую импортированную услугу как отдельный параметр, но это много скучного кода. Должно быть что-то получше. Есть идеи?





Я думал о создании интерфейса для предоставления этих услуг:
partial class BarImplementation
{
public IRequiredServices
{
public IFoo1Service IFoo1Service { get; set; }
public IFoo2Service IFoo2Service { get; set; }
public IFoo3Service IFoo3Service { get; set; }
public IFoo4Service IFoo4Service { get; set; }
public IFoo5Service IFoo5Service { get; set; }
}
}
Затем MyBarFactory реализует BarImplementation : BarImplementation.IRequiredServices. Это легко написать, но как мне передать их Zib? Я не хочу таким образом связывать Zib с его потребителем.
Я мог бы сделать IImports интерфейсом, содержащим все импортируемые мной сервисы, передавать его повсюду, а затем классы могут использовать или не использовать то, что им нравится. Но это объединяет все классы.
Я не совсем уверен, что это отвечает на ваш вопрос, но вы уже думали об использовании инъекции конструктора?
class BarImplementation : IBar
{
[ImportingConstructor]
public BarImplementation(IFoo1Service foo1, IFoo2Service foo2, ...) { }
}
Пометив свой конструктор атрибутом ImportingConstructor, он, по сути, сделает все параметры этого конструктора обязательными для импорта.
По сути, это тот путь, по которому я пошел. Все мои модули имеют свойство IHost, которое я устанавливаю после их загрузки. Затем IHost может иметь список загруженных модулей ...