Код исключения StructureMap 205 Отсутствует запрошенное свойство экземпляра - PullRequest
7 голосов
/ 12 февраля 2010

Я пробую последнюю сборку StructureMap, чтобы узнать о контейнерах IoC и тому подобном. В качестве моего первого теста у меня есть следующий класс:

public class Hospital
    {
        private Person Person { get; set; }
        private int Level { get; set; }

        public Hospital(Person employee, int level)
        {
            Person = employee;
            Level = level;
        }

        public void ShowId()
        {
            Console.WriteLine(this.Level);
            this.Person.Identify();
        }
    }

Затем я использую StructureMap следующим образом:

static void Main()
        {
            ObjectFactory.Configure(x =>
                                        {
                                            x.For<Person>().Use<Doctor>();
                                            x.ForConcreteType<Hospital>().Configure.Ctor<int>().Equals(23);
                                        });

            var h = ObjectFactory.GetInstance<Hospital>();

            h.ShowId();
        } 

Поэтому я передаю объект Doctor в качестве первого параметра конструктора в Hospital и пытаюсь установить для параметра level значение 23. Когда я запускаю приведенный выше код, я получаю:

Необработанное исключение: StructureMap.StructureMapException: Код исключения StructureMap: 205 Отсутствует запрошенное свойство экземпляра «уровень» для InstanceKey «5f8c4b74-a398-43f7- 91d5-cfefcdf120cf "

Похоже, я вообще не устанавливаю параметр level. Может кто-нибудь указать мне правильное направление - как мне установить параметр level в конструкторе?

Приветствия. Иак.

1 Ответ

12 голосов
/ 12 февраля 2010

Вы были очень близки. Вы случайно использовали метод System.Object.Equals в выражении зависимости, а не метод Is. Я также рекомендовал бы при настройке общих типов, таких как строковые или типы значений (int, DateTime), указывать имя аргумента конструктора, чтобы избежать неоднозначности.

Вот мой тест с тем, что вы ищете:

    [TestFixture]
public class configuring_concrete_types
{
    [Test]
    public void should_set_the_configured_ctor_value_type()
    {
        const int level = 23;
        var container = new Container(x =>
        {
            x.For<Person>().Use<Doctor>();
            x.ForConcreteType<Hospital>().Configure.Ctor<int>("level").Is(level);
        });

        var hospital = container.GetInstance<Hospital>();

        hospital.Level.ShouldEqual(level);
    }
}
...