Возникла проблема с автоматическим подключением к именованным экземплярам в Structure Map - PullRequest
0 голосов
/ 11 сентября 2010

Я новичок в структурировании карты и пока удачи.Однако есть одна область, с которой у меня есть небольшая проблема.Это пытается автоматически подключиться с использованием именованных экземпляров и нового синтаксиса .For (). Use ().

Независимо от того, что я делаю, я получаю последний элемент, который я настроил для данного типа, когда я пытаюсь автоматически подключиться для создания нового объекта.Я могу получить правильный элемент, используя именованные экземпляры, без проблем, когда я просто пытаюсь получить этот тип из контейнера.

Для простоты ниже показан объект ObjectFactory, но мой настоящий код использует IContainer.Оба имеют одинаковый результат для меня.

//arrange
    var expectedGreen = "Green";
    var notExpectedBlue = "Blue";
    var greenInstance = new Mock<ITestClass>();
    greenInstance.SetupGet(m => m.Data).Returns(expectedGreen);
    ObjectFactory.Configure(x => x.For<ITestClass>().Use(greenInstance.Object).Named("Green"));

    var blueInstance = new Mock<ITestClass>();
    blueInstance.SetupGet(m => m.Data).Returns(notExpectedBlue);
    ObjectFactory.Configure(x => x.For<ITestClass>().Use(blueInstance.Object).Named("Blue"));

//act
    var actual = ObjectFactory.GetNamedInstance<TestTarget>("Green");

//assert 
    Assert.AreEqual(expectedGreen, actual.TestClass.Data);

Класс TestTarget имеет конструктор, который принимает ITestClass в качестве параметра.Я ожидаю, что, запросив экземпляр TestTarget, я вернусь к созданному TestTarget, который будет ссылаться на ITestClass с именем «Green».

В конечном счете, моя цель - смоделировать случай, когда у меня есть два объекта.того же типа, который будет доступен в контейнере (например, приложение, работающее с двумя базами данных).Альтернативный подход к решению такого рода проблем также будет хорошим ответом.Тем не менее, я хочу придерживаться 2.5+ методов для этого.

Ответы [ 2 ]

2 голосов
/ 11 сентября 2010

Когда вы указываете несколько экземпляров, используйте Add() вместо Use(). Use() является синонимом старого TheDefaultIs().

ObjectFactory.Configure(x => x.For<ITestClass>().Add(blueInstance.Object)
    .Named("Blue"));
0 голосов
/ 14 сентября 2010

Оказывается, мне нужно было использовать «С», чтобы делать то, что я пытался сделать. В конечном итоге это двухэтапный процесс, но он выполняет то, что я хотел.

var greenFromContainer = ObjectFactory.GetNamedInstance<ITestClass>("Green");
var actual = ObjectFactory.With(greenFromContainer).GetInstance<TestTarget>();

Казалось бы, более сложные сценарии лучше всего обрабатывать с помощью отдельных контейнеров / реестров или с использованием расширенных правил конструктора.

...