代码之家  ›  专栏  ›  技术社区  ›  John Leidegren

用特定实例组成零件

mef
  •  1
  • John Leidegren  · 技术社区  · 14 年前

    有没有什么方法可以将一个特定的实例作为它的依赖项之一进行组合(或获取导出的值)?

    我有这样的想法:

    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 回复  |  直到 14 年前
        1
  •  1
  •   Matthew Abbott    14 年前

    所以,如果我的理解是正确的,您希望能够将任何可用的IEntityContext注入到您的MyEntitySet实例中吗?

    [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>();
    

    (使用最小起订量)

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

    这有帮助吗?抱歉,似乎不太清楚你想做什么。。。