Сделать импорт доступным вокруг вашего кода - PullRequest
1 голос
/ 13 октября 2008

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

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

Ответы [ 3 ]

1 голос
/ 16 октября 2008

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

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

Помечая ваш конструктор атрибутом ImportingConstructor, он по существу сделает все параметры этого конструктора необходимыми для импорта.

0 голосов
/ 13 октября 2008

Я мог бы сделать IImports интерфейсом, который содержит все сервисы, которые я импортирую, передавал их везде, и тогда классы могут использовать или не использовать то, что им нравится. Но это объединяет все классы вместе.

0 голосов
/ 13 октября 2008

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

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 с его потребителем таким образом.

...