Autofac: как использовать конструкционную инъекцию в классе с зависимостью от вывода другой объектной функции - PullRequest
3 голосов
/ 13 апреля 2011

Этот вопрос касается IoC в целом, но я использую Autofac, поэтому было бы неплохо использовать решение Autofac.

Итак, предположим, что следующие классы:

class A
{
    IEnumerable<B> GetBs();
}

class B 
{
    // Some code
}

class C
{
    readonly IEnumerable<B> bs;

    C(IEnumerable<B> bs)
    {
        this.bs = bs;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.Register<A>();
        builder.Register<C>();

        var container = builder.Build();
        var c = container.Resolve<C>();
        // do something with c
    }
}

указанное выше Main завершится неудачей.

Я заметил, что могу решить эту проблему, добавив следующую строку кода:

builder.Register(c => c.Resolve<A>().GetBs())

Однако, это не так. Есть ли другой способ добиться этого? Или дизайн меняется?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Как видно, структура этого класса выглядит отлично. Вы правильно используете Constructor Injection и используете статическую структуру классов для передачи инвариантов и отношений . На уровне информации, представленной здесь, я думаю, что единственное, чего не хватает, - это предложения Guard в конструкторе C:

На концептуальном уровне сложнее ответить, является ли это хорошим дизайном. Это зависит от контекста, не предоставленного здесь. Является ли B Service или Entity ? Что является предполагаемым источником Bs?

Как общее практическое правило, мы должны только внедрять Сервисы, но обрабатывать Объекты с помощью Сервисов (таких как Репозитории или Шлюзы или еще много чего), поэтому, если B представляет Сервис, было бы хорошо внедрить его в C. Если он представляет Сущность, тогда она становится подозрительной - если только С не является Сущностью ...

На другой ноте вы можете спросить о каноническом источнике Bs. Если A действительно является контейнером Bs, то вышеприведенное решение является правильным (и идиоматическим кодом Autofac). Если B действительно имеют разное происхождение, разрешение их через A может быть взломом ...

0 голосов
/ 13 апреля 2011

Учитывая ваш ответ на принятый ответ, возможно, в Autofac может использоваться другая техника. Если набор плагинов доступен во время регистрации, вы можете зарегистрировать их как коллекцию .

...