Совместное использование области при динамическом разрешении зависимостей

1

У меня есть ситуация, когда класс (Parent) имеет зависимость (IScopedInstance), а также динамически разрешает другой интерфейс (IOtherDependency) внутри метода. Реализация этого интерфейса (Dependency) имеет ту же зависимость, что и исходный класс. Я хочу, чтобы этот экземпляр был привязан к экземпляру Parent т. Parent Я хочу, чтобы один и тот же экземпляр внутри Parent и Dependency, но только если зависимость была разрешена изнутри Parent я использую Castle.Windsor как DI-контейнер.

public class Parent : IParent
{
    public Parent(IScopedInstance instance)
    {

    }

    public void DoSomething()
    {
        var anotherDependency = container.Resolve<IOtherDependency>();
    }
}

public class Dependency : IOtherDependency
{
    public Dependency(IScopedInstance instance)
    {
    }
}

Это работает, когда IOtherDepedency вводится в конструктор Parent:

container.Register(Component
            .For<IScopedInstance>()
            .ImplementedBy<ScopedInstance>()
            .LifestyleBoundTo(x => x.First(xx => 
                xx.ComponentModel.Implementation.InheritsOrImplements(typeof(IParent)))));

Но, по понятным причинам, это не сработает, если разрешить его изнутри метода, так как там нет IParent в графике зависимостей (это новый график).

Реальный случай использования немного отличается, и я не напрямую разрешаю IOtherDependency внутри метода, но я удалил всю дополнительную информацию, которая не нужна.

есть идеи как это сделать?

Теги:
dependency-injection
inversion-of-control
castle-windsor

1 ответ

0

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

  • 0
    @ChristianoDegiorgis прав. Вы должны зарегистрировать фабричный метод или фабрику в TypeFactorySelector, чтобы разрешить ваши зависимости и протолкнуть их через конструктор. Другой недостаток вашей реализации заключается в том, что ваш класс знает о контейнере и имеет зависимость от контейнера и его сборки. Есть ли какие-то препятствия, мешающие вам использовать инжектор конструктора через фабрики?
  • 0
    Как я уже сказал, я не разрешаю зависимость напрямую, но делаю это через фабрику, здесь это просто не важно. У меня ограниченный образ жизни (см. Мой последний фрагмент кода), просто внутри метода мне нужна динамическая отправка. Я использую универсальный интерфейс, который повторно используется в нескольких местах. Проблема с областью видимости состоит в том, что есть два отдельных графика, поэтому у второго нет доступа к области видимости первого

Ещё вопросы

Сообщество Overcoder
Наверх
Меню