Я использую 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();
}