LightInject: Конструктор Инъекция и IDisposable
Я хотел бы использовать функцию инжекции конструктора LightInject, но сначала я хотел бы прояснить некоторые моменты, связанные с управлением жизненным циклом IDisposables.
Учтите следующее:
Пример А
public class Foo : IDisposable
{
readonly IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
public void Dispose()
{
}
}
Пример Б
public class Foo : IDisposable
{
readonly IBar bar;
public Foo(Func<string, IBar> bar)
{
this.bar = bar("myParameter");
}
public void Dispose()
{
}
}
Мои вопросы для обоих примеров:
- Будет ли метод Dispose вызываться LightInject на IBar после удаления Foo, или я должен вызвать dispose самостоятельно?
- Если IBar использует PerContainerLifeTime, будет ли вызываться Dispose после удаления каждого экземпляра Foo?
Правильно. Второй вопрос - глупо. Я понимаю, что экземпляр PerContainerLifeTime, разумеется, удаляется при удалении контейнера. Мой общий вопрос: отслеживает ли LightInject внедренные зависимости и удаляет их сам?
1 ответ
Решение
LightInject будет отслеживать только те экземпляры, которые он создает, если служба / зависимость зарегистрирована в PerScopeLifetime или PerRequestLifetime. Взгляните на следующий пример:
class Program
{
private static IServiceContainer container = new ServiceContainer();
static void Main(string[] args)
{
container.Register(f => new Foo("PerScopeFoo"), "PerScopeFoo", new PerScopeLifetime());
container.Register(f => new Foo("PerRequestFoo"), "PerRequestFoo", new PerRequestLifeTime());
container.Register(f => new Foo("PerContainerFoo"), "PerContainerFoo", new PerScopeLifetime());
container.Register(f => new Foo("TransientFoo"), "TransientFoo");
using (container.BeginScope())
{
var first = container.GetInstance<Foo>("PerScopeFoo");
var second = container.GetInstance<Foo>("PerScopeFoo");
Debug.Assert(first == second);
first = container.GetInstance<Foo>("PerRequestFoo");
second = container.GetInstance<Foo>("PerRequestFoo");
Debug.Assert(first != second);
first = container.GetInstance<Foo>("PerContainerFoo");
second = container.GetInstance<Foo>("PerContainerFoo");
Debug.Assert(first == second);
first = container.GetInstance<Foo>("TransientFoo");
second = container.GetInstance<Foo>("TransientFoo");
Debug.Assert(first != second);
}
container.Dispose();
Console.ReadKey();
}
}
public class Foo : IDisposable
{
private readonly string name;
public Foo(string name)
{
this.name = name;
}
public void Dispose()
{
Console.WriteLine(name + " disposed");
}
}