Попытка выяснить, как настроить StructureMap для внедрения метода установки свойств. У меня есть сценарии, в которых я разрешаю экземпляр через контейнер, а также сценарии, в которых я получаю экземпляр в другом месте, а затем вызываю функцию congainer.BuildUp ().
Ниже приведен пример набора классов, в котором я хочу настроить инжекцию для конкретного типа Bar. Если я использую различные опции, отмеченные 1) -5) ниже, я получу другое поведение от StructureMap. Некоторые случаи должны завершиться сбоем, так как они неполные, но все случаи, когда я настраиваю инъекцию для свойств Foo и Qux, должны работать. Они не. Особенно функция .BuildUp () не работает.
Вместо того, чтобы подробно объяснять каждый результат, возможно, кто-то из обладателей StructureMap может быть настолько любезен, чтобы указать на недостаток в моей логике и / или запустить пример кода?
Я предполагаю, что есть и другие способы работы с конфигурациями, но я хотел бы иметь возможность четко указать, какие инъекции я ожидаю от Bar.
Заранее спасибо!
[TestClass]
public class StructureMapTests
{
public interface IFoo { }
public interface IBaz { }
public interface IQux { }
private class Foo : IFoo { }
private class Baz : IBaz { }
private class Qux : IQux { }
private class Bar
{
public IFoo Foo { get; set; }
public IFoo FooSomething { get; set; }
public IBaz Baz { get; set; }
public IQux Qux { get; set; }
}
Container Container;
[TestInitialize]
public void Configure_StructureMap()
{
Container = new Container();
Container.Configure(x =>
{
x.For<IFoo>().Use<Foo>();
x.For<IBaz>().Use<Baz>();
x.For<IQux>().Use<Qux>();
x.FillAllPropertiesOfType<IBaz>();
x.SetAllProperties(policy =>
{
policy.NameMatches(name => name.EndsWith("Something"));
});
// 1)
//x.ForConcreteType<Bar>().Configure.SetProperty(r => r.Foo = new Foo());
//x.ForConcreteType<Bar>().Configure.Setter<IQux>().IsTheDefault();
// 2)
//x.ForConcreteType<Bar>().Configure.SetProperty(r => r.Foo = new Foo());
// 3)
//x.ForConcreteType<Bar>().Configure.Setter<IQux>().IsTheDefault();
// 4)
//x.ForConcreteType<Bar>().Configure.Setter<IQux>().IsTheDefault().SetProperty(r => r.Foo = new Foo());
// 5)
//x.ForConcreteType<Bar>().Configure.SetProperty(r => r.Foo = new Foo()).Setter<IQux>().IsTheDefault();
});
}
[TestMethod]
public void Resolve_Bar_through_container()
{
var bar = Container.GetInstance<Bar>();
Debug.WriteLine("Resolve:");
Debug.WriteLine(string.Format("Foo is {0}null.", bar.Foo == null ? "" : "not "));
Debug.WriteLine(string.Format("FooSomething is {0}null.", bar.FooSomething == null ? "" : "not "));
Debug.WriteLine(string.Format("Baz is {0}null.", bar.Baz == null ? "" : "not "));
Debug.WriteLine(string.Format("Qux is {0}null.", bar.Qux == null ? "" : "not "));
Assert.IsTrue(bar.Foo != null && bar.FooSomething != null && bar.Baz != null && bar.Qux != null);
}
[TestMethod]
public void BuildUp_instance_of_bar()
{
var bar = new Bar();
Container.BuildUp(bar);
Debug.WriteLine("Build up:");
Debug.WriteLine(string.Format("Foo is {0}null.", bar.Foo == null ? "" : "not "));
Debug.WriteLine(string.Format("FooSomething is {0}null.", bar.FooSomething == null ? "" : "not "));
Debug.WriteLine(string.Format("Baz is {0}null.", bar.Baz == null ? "" : "not "));
Debug.WriteLine(string.Format("Qux is {0}null.", bar.Qux == null ? "" : "not "));
Assert.IsTrue(bar.Foo != null && bar.FooSomething != null && bar.Baz != null && bar.Qux != null);
}
}