StructureMap .ForConcreteType <T>(). Конфигурация Configure.SetProperty не играет с логикой BuildUp - PullRequest
2 голосов
/ 24 августа 2011

Попытка выяснить, как настроить 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);
    }
}

1 Ответ

0 голосов
/ 07 ноября 2011

Вы можете использовать метод OnCreationForAll для регистрации свойств Bar:

container.Configure(r => r.For<Bar>().OnCreationForAll(bar =>
{
    bar.Foo = container.GetInstance<IFoo>();
    bar.FooSomething = container.GetInstance<IFoo>();
    bar.Baz = container.GetInstance<IBaz>();
    bar.Qux = container.GetInstance<IQux>();
})); 
...