1

在我的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 */);
    }
}

我可以将每个导入的服务作为单独的参数传递,但这是很多无聊的代码。一定有更好的东西。有任何想法吗?

4

3 回答 3

1

我不完全确定这是否能回答您的问题,但您是否考虑过使用构造函数注入?

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

通过使用 ImportingConstructor 属性标记您的构造函数,它实际上将使该构造函数的所有参数都需要导入。

于 2008-10-16T05:39:57.390 回答
0

我想过制作一个接口来提供这些服务:

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这种方式与它的消费者耦合。

于 2008-10-13T19:18:25.023 回答
0

我可以创建IImports一个包含我导入的所有服务的接口,将其传递到任何地方,然后类可以使用或不使用它们喜欢的任何一个。但这将所有课程结合在一起。

于 2008-10-13T19:19:40.403 回答