StructureMap - получает зависимости конструктора через имя - PullRequest
0 голосов
/ 29 марта 2011

Как я могу получить зависимости конструктора через имя, когда самому классу не нужно получать конкретную реализацию через имя.

public class PriceValidator : IPriceValidator
{
    private readonly IEnumerable<IPriceValidationRule> _priceValidationRules;

    public PriceValidator(IEnumerable<IPriceValidationRule> priceValidationRules)
    {
        _priceValidationRules = priceValidationRules;
    }

    public bool IsPriceValid(decimal price)
    {
        return _priceValidationRules.All(priceValidator => priceValidator.IsPriceValid(price));
    }
}

Звоните:

_priceValidator = ObjectFactory.GetInstance<IPriceValidator>();

Итак, я хочу конкретную реализацию IPriceValidator, но с конкретными (по имени) правилами валидации.

Edit:

Мои правила:

For<IPriceValidationRule>().Use<MaxPriceValidationRule>().Named("A");
For<IPriceValidationRule>().Use<MinPriceValidationRule>().Named("A");
For<IPriceValidationRule>().Use<MyDoublePriceValidationRule>().Named("B");
For<IPriceValidationRule>().Use<MyPriceValidationRule>().Named("B");

Как я могу использовать одно и то же правило с разными именами? Поэтому, когда я говорю, дайте мне все экземпляры с именем "X", я хочу получить MaxPriceValidationRule?

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Я бы рекомендовал создать собственную фабрику. Эта фабрика будет обрабатывать создание вашего конкретного экземпляра вашего класса. Затем добавьте эту фабрику в качестве зависимости, где вы хотите использовать свой конкретный экземпляр.

0 голосов
/ 31 марта 2011

Вы можете указать, какие объекты должны быть вставлены в перечисляемый параметр, используя следующий синтаксис:

ObjectFactory.Configure(c =>
            {
                c.For<IPriceValidator>().Use<PriceValidatory>()
                    .EnumerableOf<IPriceValidationRule>().Contains(i => { 
                        i.Type<ValidationRule1>();
                        i.Type<ValidationRule2>();
                    });
            });
...