Unity имеет CreateChildContainer, есть ли эквивалент в SimpleInjector или LightInject
Мы находимся в процессе оценки SimpleInjector и LightInject, чтобы заменить нашу текущую реализацию Unity в нашем приложении. В Unity есть метод, который допускает иерархию контейнеров с вызовом CreateChildContainer(). Есть ли эквивалент для SimpleInjector и LightInject?
1 ответ
Для этого LightInject использует PerScopeLifetime и PerRequestLifetime.
PerScopeLifetime создает только один экземпляр данной службы для каждой области и удаляет экземпляр службы в конце области, если он реализует IDisposable.
PerRequestLifetime создает новые экземпляры для каждого запроса (GetInstance) и удаляет все экземпляры в конце запроса.
Сама область запускается с использованием метода BeginScope.
PerScopeLifetime
container.Register<IFoo, Foo>(new PerScopeLifetime());
using(container.BeginScope())
{
var firstInstance = container.GetInstance<IFoo>();
var secondInstance = container.GetInstance<IFoo>();
Assert.AreSame(firstInstance, secondInstance);
} //<- Instances implementing IDisposable are disposed here.
PerRequestLifetime
container.Register<IFoo, Foo>(new PerRequestLifetime());
using(container.BeginScope())
{
var firstInstance = container.GetInstance<IFoo>();
var secondInstance = container.GetInstance<IFoo>();
Assert.AreNotSame(firstInstance, secondInstance);
} //<- Instances implementing IDisposable are disposed here.
Обычно метод BeginScope вызывается различными расширениями, доступными для LightInject.
Примеры этого можно найти в LightInject.Web, LightInject.Mvc и LightInject.WebApi.