Как утилизировать (или просто сбросить) Фасад, не выбрасывая корневой контейнер? - PullRequest
0 голосов
/ 14 февраля 2019

Я использую DryIoc 3.0.2 с Prism WPF в модульном приложении с вкладками: каждая вкладка (например, вкладка Chrome - поддерживает выделение) имеет свой собственный контейнер, авторизованный UserContext и набор общих модулей Prism, инициализированные специально дляКонтейнер вкладки (как описано здесь ).

Необходимо корректно (и в ближайшее время) разделить дочерние контейнеры с сохранением корневых зависимостей.Любая вкладка может быть закрыта в любое время с использованием всех ее ресурсов.

Тестовые задания:

    public interface IStorage { }

    public class Storage : IStorage { }

    public class UserContext
    {
        public UserContext(IStorage storage)
        {

        }
    }

Тестирование:

[Test] // Failed.
public void TestMultipleFacades()
{
    var container = new Container();

    container.Register<IStorage, Storage>(Reuse.Singleton);
    // ..Some other registrations here.

    // Container for isolated tab with its own context.
    var local1 = container.CreateFacade();
        local1.Register<UserContext>(Reuse.Singleton);

    // For another tab.
    var local2 = container.CreateFacade();
        local2.Register<UserContext>(Reuse.Singleton);

    Assert.AreNotEqual(local1.Resolve<UserContext>(), local2.Resolve<UserContext>());

    // Closing first tab.
    local1.Dispose(); // Free all local1 data with its own singletones!

    // Opening a new tab.
    //
    // Throws DryIoc.ContainerException:
    // Container is disposed and should not be used: Container is disposed.
    var local3 = container.CreateFacade();
}

[Test] // Passed!
public void TestMultipleContainers()
{
    var rootContainer = new Container();

    rootContainer.Register<IStorage, Storage>(Reuse.Singleton);
    // ..Some other registrations here.

    var local1 = new Container(rootContainer.Rules);
        // Direct re-registration (hard to enumerate all of rootContainer).
        local1.UseInstance(rootContainer.Resolve<IStorage>());
        local1.Register<UserContext>(Reuse.Singleton);

    var local2 = new Container(rootContainer.Rules);
        local2.UseInstance(rootContainer.Resolve<IStorage>());
        local2.Register<UserContext>(Reuse.Singleton);

    Assert.AreNotEqual(local1.Resolve<UserContext>(), local2.Resolve<UserContext>());

    local1.Dispose(); // Free all local1 data with its own singletones!

    var local3 = new Container(rootContainer.Rules);
}

[Test]
public void TestMultipleScopes()
{
    var rootContainer = new Container();

    rootContainer.Register<IStorage, Storage>(Reuse.Singleton);
    // ..Some other registrations here.

    var local1 = (IContainer) rootContainer.OpenScope();
        local1.Register<UserContext>(Reuse.Singleton);

    var local2 = (IContainer) rootContainer.OpenScope();
        local2.Register<UserContext>(Reuse.Singleton);

    Assert.AreNotEqual(local1.Resolve<UserContext>(), local2.Resolve<UserContext>());

    local1.Dispose(); // Free all local1 data with its own singletones!

    var local3 = (IContainer) rootContainer.OpenScope();
}

1 Ответ

0 голосов
/ 15 февраля 2019

Предлагаю создать проблему с меткой question и репозиторием DryIoc (я владелец) и добавить PR с тестами в проект DryIoc.IssuesTests.Главным образом, потому что у вас уже есть тесты, которые можно запустить и проверить быстрее таким образом.Также вы сможете автоматически проверять тесты на наличие последней версии.

...