StructureMap: Конкретный конструктор класса принимает несколько аргументов одного типа интерфейса - PullRequest
4 голосов
/ 31 октября 2011

Я хочу использовать StructureMap ObjectFactory для обработки экземпляров моих классов, используемых моей службой WCF. Хотя моего ограниченного опыта достаточно для обработки простых отображений 1: 1 между одним интерфейсом и этим единственным классом, который его реализует, я столкнулся с проблемой, когда конструктор принимает несколько параметров одного и того же интерфейса.

Я считаю, что могу связать несколько конкретных классов с одним и тем же интерфейсом, дав каждому отображению имя, но как мне указать StructureMap, какое отображение использовать для первого и второго параметра конструктора?

Это класс, который я хочу, чтобы ObjectFactory обрабатывал для меня:

public class MasterPolicy {
    public MasterPolicy(IPolicy alfaPolicy, IPolicy numericPolicy)
    {
        AlphaPolicy = alphaPolicy;
        NumericPolicy = numericPolicy;
    }

    public IPolicy AlphaPolicy {get; private set; }
    public IPolicy NumericPolicy {get; private set; }

    public bool IsValid(string s)
    {
         if (!AlphaPolicy.IsValid(s)) return false;
         if (!NumericPolicy.IsValid(s)) return false;
         return true;
    }
}

Интерфейс IPolicy реализован несколькими классами:

public interface IPolicy
{
    bool IsValid(string s);
}

public class AlphaPolicy : IPolicy
{
    public bool IsValid(string s) { return true; }
}

public class NumericPolicy : IPolicy
{
    public bool IsValid(string s) { return true; }
}

(Конечно, MasterPolicy тоже может реализовывать интерфейс IPolicy).

1 Ответ

12 голосов
/ 31 октября 2011

Вы можете указать зависимости конструктора и указать структуре карты, какой именованный аргумент должен иметь зависимость:

For<MasterPolicy>.Use<MasterPolicy>()
    .Ctor<IPolicy>("alphaPolicy").Is<AlphaPolicy>()
    .Ctor<IPolicy>("numericPolicy").Is<NumericPolicy>();
...