使用特定实例撰写零件

时间:2010-07-16 11:16:20

标签: mef

我是否有任何方法可以将特定实例作为其中一个依赖项进行组合(或获取导出值)?

我有这样的事情:

public interface IEntityContext
{
    IEntitySet<T> GetEntitySet<T>();
}
[Export(typeof(IEntitySet<MyEntity>))]
class MyEntitySet
{
    public MyEntitySet(IEntityContext context)
    {
    }
}
// then through code
var container = ...;
using (var context = container.GetExportedValue<IEntityContext>())
{
    var myEntitySet = context.GetEntitySet<MyEntity>();
    // I wan't myEntitySet to have the above context constructor injected
}

我试图为可测试性而嘲笑像实体框架这样的东西。不确定我是否想沿着这条路走下去。无论如何,我应该为此目的创建一个新的容器。特定于模拟此IEntityContext个对象的容器。

1 个答案:

答案 0 :(得分:1)

因此,如果我的理解是正确的,您希望能够为您的MyEntitySet实例注入任何可用的IEntityContext吗?

[Export(typeof(IEntitySet<MyEntity>))]
public class MyEntitySet : IEntitySet<MyEntity>
{
    [ImportingConstructor]
    public MyEntitySet(IEntityContext context)
    {

    }
}

鉴于您是否想要模拟IEntityContext?如果是这样,你可以这样做:

var contextMock = new Mock<IEntityContext>();
var setMock = new Mock<IEntitySet<MyEntity>>();

contextMock
    .Setup(m => m.GetEntitySet<MyEntity>())
    .Returns(setMock.Object);

Container.ComposeExportedValue<IEntityContext>(contextMock.Object);

var context = Container.GetExportedValue<IEntityContext>();
var entitySet = context.GetEntitySet<MyEntity>();

(那是使用Moq)

您可以通过添加导出值来使用现有的CompositionContainer基础结构。

这有帮助吗?对不起,你似乎不清楚你要做什么......