StructureMap: настроить конкретные классы во время выполнения? - PullRequest
1 голос
/ 15 февраля 2010

Я знаю, что Конкретные типы можно настроить с помощью Структурной карты следующим образом:

ForRequestedType<Rule>().TheDefault.Is.Object(new ColorRule("Green"));

Это работает, если вы знаете тип заранее. Я хочу сделать это во время выполнения, и, похоже, не существует способа. Может ли кто-нибудь просветить меня? Что я хочу сделать, это что-то вроде следующего: (Кажется, это не поддерживается структурной картой)

ForRequestedType(typeof(Rule)).TheDefault.Is.Object(new ColorRule("Green"));

Причина этого в том, что я работаю над оболочкой для конфигурации структурной карты. И я не буду знать тип заранее. Для .Object (new ColorRule ("Green")) я собираюсь передать делегат, который фактически будет создавать объект по запросу.

1 Ответ

2 голосов
/ 16 февраля 2010

Недавно Джереми добавил возможность настроить Func в качестве компоновщика для вашего типа. Вот пример использования делегата / лямбды в качестве вашего компоновщика.

    public interface IRule
{
    string Color { get; set; }
}

public class ColorfulRule : IRule
{
    public string Color { get; set; }

    public ColorfulRule(string color)
    {
        Color = color;
    }
}

[TestFixture]
public class configuring_delegates
{
    [Test]
    public void test()
    {
        var color = "green";
        Func<IRule> builder = () => new ColorfulRule(color);

        var container = new Container(cfg=>
        {
            cfg.For<IRule>().Use(builder);
        });

        container.GetInstance<IRule>().Color.ShouldEqual("green");

        color = "blue";

        container.GetInstance<IRule>().Color.ShouldEqual("blue");
    }
}
...