2010-09-23 1 views
0

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

Я хочу добавить экземпляр «ITestProperty» (реализованный с помощью «TestProperty») в другой класс в качестве свойства. Когда я пытаюсь запустить код, я получаю исключение (StructureMap Error Code 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; } 
} 

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

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

+1

Ваши регистрационные данные показывают, что вы создали именованный экземпляр «Test», но ваш тестовый код просто запрашивает экземпляр по умолчанию (без указания имени). Соответствует ли именование экземпляра? –

+0

Да, это упрощенная версия того, что у нас есть в производстве - у нас есть несколько экземпляров. Тем не менее, я бы предпочел не использовать именованные экземпляры, если это возможно, и просто иметь дело с типами - есть другие причины, по которым мы их использовали. –

ответ

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, вы можете обновить его до последней версии. Вот новый синтаксис:

+0

Спасибо, Робин. Нам пришлось обновить и использовать третий вариант, но он отлично работал. Приветствия. –

+0

Я пытаюсь использовать этот код, чтобы ввести Func в качестве сеттера в свой пользовательский ActionFilterAttribute. Я просто не могу подключить его вместе с помощью этого кода. Любые идеи почему? – Joel

+0

Не проглядывая код, я уже давно отсутствую в StructureMap. Может быть, опубликовать новый вопрос? –