Как можно использовать StructureMap для создания зависимостей установщика объектов, которые имеют аргументы примитивного конструктора?

У меня есть объект «TestProperty», который реализует «ITestProperty». "TestProperty" принимает аргумент строкового конструктора. Это настраивается в StructureMap с помощью чего-то вроде CtorDependency или WithCtorArg.

Я хочу внедрить экземпляр «ITestProperty» (реализованный с помощью «TestProperty») в другой класс в качестве свойства. Когда я пытаюсь запустить код, я получаю исключение (код ошибки StructureMap 205, «Отсутствует запрошенное свойство экземпляра»).

Вот упрощенная версия, воссоздающая проблему:

Контрольная работа:

[Test]
public void Can_resolve_the_correct_property()
{
    ObjectFactory.Initialize( x => x.AddRegistry( new TestRegistry() ) );

    var instance = ObjectFactory.GetInstance<TestController>();
}

Настройка реестра:

public class TestRegistry : Registry
{
    public TestRegistry()
    {
        ForRequestedType<ITestProperty>().AddInstances( 
            i => i.OfConcreteType<TestProperty>().WithName( "Test" )
                .CtorDependency<string>( "arg" ).Is( "abc" )
        );

        //ForConcreteType<TestProperty>().Configure
            .CtorDependency<string>( "arg" ).Is( "abc" );

        ForConcreteType<TestController>().Configure
            .SetterDependency( p => p.Property ).Is<TestProperty>()
            .WithName( "Test" );
    }
}

Тестовые объекты:

public interface ITestProperty { }

public class TestProperty : ITestProperty
{
    private readonly string arg;

    public TestProperty( string arg )
    {
        this.arg = arg;
    }

    public string Arg { get { return arg; } }
}

public class TestController
{
    public ITestProperty Property { get; set; }
}

Когда мы переходим к инициализации объекта «TestController» выше, возникает исключение. Можно ли это сделать с помощью StructureMap? Предполагая, что это возможно, что мне нужно сделать, чтобы заставить его работать?

Заранее спасибо.


person Zac Seth    schedule 23.09.2010    source источник
comment
Ваши регистрации показывают, что вы создаете именованный экземпляр Test, но ваш тестовый код просто запрашивает экземпляр по умолчанию (имя не указано). Актуально ли наименование экземпляра?   -  person Joshua Flanagan    schedule 23.09.2010
comment
Да, это упрощенная версия того, что у нас есть в продакшене — у нас есть несколько экземпляров. Тем не менее, я бы предпочел не использовать именованные экземпляры, если это возможно, и иметь дело только с типами — хотя есть и другие причины, по которым мы их использовали.   -  person Zac Seth    schedule 24.09.2010


Ответы (1)


Есть несколько способов сделать это, как упомянул Джош, если именованный экземпляр важен, то вы хотите, чтобы он был в вашем реестре:

ForRequestedType<ITestProperty>().AddInstances(i => 
    i.OfConcreteType<TestProperty>().WithName("Test")
        .WithCtorArg("arg").EqualTo("abc"));

ForConcreteType<TestController>().Configure
    .SetterDependency(p => p.Property).Is(c => c
        .GetInstance<ITestProperty>("Test"));

В противном случае вы можете сделать это:

ForRequestedType<ITestProperty>().TheDefault.Is
    .OfConcreteType<TestProperty>()
    .WithCtorArg("arg").EqualTo("abc");

ForConcreteType<TestController>().Configure
    .SetterDependency(p => p.Property).IsTheDefault();

Кроме того, это старый синтаксис StructureMap, вы можете обновить его до последней версии. Вот новый синтаксис:

For<ITestProperty>().Add<TestProperty>().Named("Test")
    .Ctor<string>("arg").Is("abc");

ForConcreteType<TestController>().Configure
    .Setter(p => p.Property).Is(c => c
        .GetInstance<ITestProperty>("Test"));
person Robin Clowers    schedule 23.09.2010
comment
Спасибо, Робин. Нам пришлось обновить и использовать третий вариант, но он работал отлично. Ваше здоровье. - person Zac Seth; 24.09.2010
comment
Я пытаюсь использовать этот код для внедрения Func‹IUnitOfWork› в качестве установщика в мой пользовательский атрибут ActionFilterAttribute. Я просто не могу связать это вместе, используя этот код. Есть идеи, почему? - person Joel; 02.09.2013
comment
Не без просмотра кода я уже давно не пользуюсь StructureMap. Может быть, опубликовать новый вопрос? - person Robin Clowers; 03.09.2013