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()
    {

    }
 }

Мои вопросы для обоих примеров:

  1. Будет ли метод Dispose вызываться LightInject на IBar после удаления Foo, или я должен вызвать dispose самостоятельно?
  2. Если 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");
    }
}
Другие вопросы по тегам