Составьте часть с конкретным экземпляром - PullRequest
1 голос
/ 16 июля 2010

Можно ли как-нибудь составить (или получить экспортированное значение) конкретный экземпляр в качестве одной из его зависимостей?

У меня есть что-то вроде этого:

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 Ответ

1 голос
/ 16 июля 2010

Итак, если мое понимание верно, вы хотите иметь возможность внедрить любой 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>();

(используется Moq)

Вы можете использовать существующую инфраструктуру CompositionContainer, добавив экспортированное значение.

Делает ли этопомочь вообще?Извините, не совсем понятно, что вы пытаетесь сделать ...

...