Как можно использовать StructureMap для создания установочных зависимостей объектов, имеющих аргументы примитивного конструктора? - PullRequest
0 голосов
/ 23 сентября 2010

У меня есть объект "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?Предполагая, что это возможно, что мне нужно сделать, чтобы это заработало?

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

1 Ответ

1 голос
/ 23 сентября 2010

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

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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...