StructureMap - 通过名称获取构造函数依赖项

时间:2011-03-28 20:06:33

标签: c# dependency-injection constructor ioc-container structuremap

当类本身不需要通过名称获取具体实现时,如何通过名称获取构造函数依赖项。

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实现,但需要具体的(按名称)验证规则。

编辑:

我的规则:

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 个答案:

答案 0 :(得分:2)

我建议你创建自己的工厂。该工厂将处理创建您的类的特定实例。然后将此工厂注入依赖项,您希望使用特定实例。

答案 1 :(得分:0)

您可以使用以下语法指定应将哪些对象注入可枚举参数:

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