Делаем импорт доступным вокруг вашего кода

В моем использовании 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 */);
    }
}

Я мог бы передать каждую импортированную услугу как отдельный параметр, но это много скучного кода. Должно быть что-то получше. Есть идеи?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 072
3

Ответы 3

Я думал о создании интерфейса для предоставления этих услуг:

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 интерфейсом, содержащим все импортируемые мной сервисы, передавать его повсюду, а затем классы могут использовать или не использовать то, что им нравится. Но это объединяет все классы.

По сути, это тот путь, по которому я пошел. Все мои модули имеют свойство IHost, которое я устанавливаю после их загрузки. Затем IHost может иметь список загруженных модулей ...

Tim 31.05.2010 03:43

Я не совсем уверен, что это отвечает на ваш вопрос, но вы уже думали об использовании инъекции конструктора?

class BarImplementation : IBar
{
    [ImportingConstructor]
    public BarImplementation(IFoo1Service foo1, IFoo2Service foo2, ...) { }
}

Пометив свой конструктор атрибутом ImportingConstructor, он, по сути, сделает все параметры этого конструктора обязательными для импорта.

Другие вопросы по теме