使用MEF导出多个接口并返回一个实例作为结果

3

我有一个类实现了两个接口,A和B:

public class Test
{
    public Test()
    {
        Usage<IA> x = new Usage<IA>();
        Usage<IB> y = new Usage<IB>();
        var b = x.Implementation.Value.Equals(y.Implementation.Value);
    }
}

public interface IA { }
public interface IB { }

[Export(typeof(IA))]
[Export(typeof(IB))]
public class Impl : IA, IB
{
    public Impl()
    {

    }
}

public class Usage<T>
{
    public Usage()
    {
        CompositionContainer c = new CompositionContainer(new AssemblyCatalog(this.GetType().Assembly));
        c.ComposeParts(this);

        var x = Implementation.Value.ToString();
    }

    [Import]
    public Lazy<T> Implementation { get; set; }
}

我的问题是这两个属性都有自己的Impl类实例。我想让它们指向同一个实例。我试图通过CreationPolicy.Shared来实现,但也没有用。你觉得我的操作有什么不对,还是这个情况不被支持?


我刚刚尝试了你的代码,将[PartCreationPolicy(CreationPolicy.Shared)]添加到Impl类中,结果和预期一样正常;ImplAImplB都被设置为Impl的同一个实例。 - Richard Deeming
我过于简化了我的问题,因为那个例子实际上是可以工作的(即使没有PartCreationPolicy)。我用代表实际情况的东西改变了示例代码。 - Tom Kuijsten
2
问题在于您为每个Usage类的实例使用了不同的CompositionContainer。导出的实例将不会在不同的容器之间共享。 - Richard Deeming
对不起,是我太傻了。谢谢,当然就是这样! - Tom Kuijsten
为什么不把那个作为答案,这样就可以选择为正确答案了。 - Patrick Magee
1个回答

2
问题在于您为每个Usage类的实例使用了不同的CompositionContainer。导出的实例不会在不同的容器之间共享。
Richard Deeming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接