DryIo c Область применения и повторное использование - PullRequest
1 голос
/ 06 февраля 2020

Я хотел бы зарегистрировать две службы, A & B, с разными временами жизни.

Мой вариант использования похож на "Браузер" и "Вкладки".
У меня одна область действия в течение времени жизни исполняемого файла (браузера) и одного «subScope» для каждой вкладки.
Я хочу, чтобы A был единичным в области видимости браузера (время жизни браузера).
Теперь я хотел бы разрешить другой B, но то же самое A на каждой вкладке.
Я прочитал документы GitHub, но похоже, что я получу новый A на каждой вкладке.

Псевдокод будет выглядеть например:

var container = new Container();
container.Register<A>(Reuse.Scoped);
container.Register<B>(Reuse.Scoped);


using (var browserScope = container.OpenScope())
{
    using (var tabScope1 = browserScope.OpenScope())
    {
        var a1 = tabScope1.Resolve<A>();
        var b1 = tabScope1.Resolve<B>();
    }

    using (var tabScope2 = browserScope.OpenScope())
    {
        var a2 = tabScope2.Resolve<A>();
        var b2 = tabScope2.Resolve<B>();
    }
}

Я бы хотел, чтобы a1 и a2 были разрешены как один и тот же экземпляр.
Как я могу выполнить sh это?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Вы можете достичь этого с помощью названной области видимости, как это - живой пример https://dotnetfiddle.net/pqZ4ah

Полный источник:

using System;
using DryIoc;

public class Program
{
    class A { }
    class B { }

    enum UIScope { Browser, Tab }

    public static void Main()
    {
        var container = new Container(r => r.WithUseInterpretation());
        container.Register<A>(Reuse.ScopedTo(UIScope.Browser));
        container.Register<B>(Reuse.ScopedTo(UIScope.Tab));

        using (var browserScope = container.OpenScope(UIScope.Browser))
        {
            A a1, a2;
            using (var tabScope1 = browserScope.OpenScope(UIScope.Tab))
            {
                a1 = tabScope1.Resolve<A>();
                var b1 = tabScope1.Resolve<B>();
            }

            using (var tabScope2 = browserScope.OpenScope(UIScope.Tab))
            {
                a2 = tabScope2.Resolve<A>();
                var b2 = tabScope2.Resolve<B>();
            }

            Console.WriteLine(a1 == a2);
        }
    }
}

0 голосов
/ 06 февраля 2020

Хорошо, так что я в итоге сделал так:

var container = new Container();
container.Register<A>(Reuse.Singleton);
container.Register<B>(Reuse.Scoped);

using (var tabScope1 = container.OpenScope())
{
    var b1 = tabScope1.Resolve<B>();
}
using (var tabScope2 = container.OpenScope())
{
    var b2 = tabScope2.Resolve<B>();
}

class A { }

class B
{
    private readonly A _a;

    public B(A a) { _a = a; }
}

Оба экземпляра B получают один и тот же экземпляр A.
Возможно, это не самое элегантное решение, но у меня это работает :) 1007 *

...