Нужно ли регистрировать каждый класс, прежде чем контейнер autoofac сможет разрешиться? - PullRequest
12 голосов
/ 05 августа 2010

скажем так:

public class B {};

public class C
{
     public C(B b){}
}

Чтобы разрешить C из контейнера Autofac, мне нужно зарегистрировать B и C в контейнере. Но сегодня я использовал Unity , кажется, мне просто нужно зарегистрировать B в контейнере, тогда C можно разрешить.

Значит, Autofac не может делать то же, что и Unity?

1 Ответ

21 голосов
/ 05 августа 2010

При использовании готового Autofac ожидается, что каждый тип, который вы хотите использовать, регистрируется в контейнере, либо напрямую, используя методы Register..., либо массово, используя RegisterAssemblyTypes.Но есть и другие варианты, взгляните на статью Николаса о разрешении всего .Так что да, Autofac может делать то же, что и Unity, но вам придется его включить.

Обновление: на самом деле, функция «разрешить что-нибудь» теперь встроена, и вы можетевыполните следующие действия:

        var cb = new ContainerBuilder();
        cb.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
        return cb.Build();

С помощью AnyConcreteTypeNotAlreadyRegisteredSource вы можете разрешить оба значения C и B, не регистрируя ни одного из них.

Обратите внимание, что время жизни служб разрешеноAnyConcreteTypeNotAlreadyRegisteredSource будет "на область действия зависимости" .

Примечание: эта тема в группе обсуждения Autofac связана.

...