Сильная ссылка Autofac 2 - PullRequest
1 голос
/ 02 февраля 2011

новичок здесь, извините, если это очевидный вопрос.

Я прочитал с этой страницы: http://code.google.com/p/autofac/wiki/NewInV2

В Autofac 1 контейнер содержит слабые ссылки. Это имеет смысл, если объекты, на которые ссылаются, используют удаление для освобождения ресурсов GC / финализатора, но если метод dispose содержит логику приложения, тогда синхронизация GC может привести к непредвиденному поведению.

Autofac 2 содержит нормальные ссылки. Чтобы отказаться от этого поведения и управлять удалением вручную, используйте модификатор регистрации ExternallyOwned.

Значит ли это, что когда мне нужно выпустить объект, разрешенный Autofac для GC, я не могу просто сказать:

a = null;

потому что Autofac содержит сильную ссылку на объект. Вместо этого я должен использовать Owned <>:

public class MyClass
{
    public MyClass(Owned<A> a)
    {
        a.Value.Dosomething();
        a.Dispose();
    }
}

или используйте модификатор регистрации ExternallyOwned:

builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).ExternallyOwned();

позже я смогу использовать = null для освобождения объекта в ГХ.

Это верно?

Спасибо!

1 Ответ

3 голосов
/ 02 февраля 2011

По умолчанию вам не нужно ничего утилизировать - Autofac автоматически идентифицирует и удаляет любые IDisposable экземпляры, которые он создал, когда удаляется их содержащая область действия.

Вам нужно использовать Owned<T> или ExternallyOwned() только в том случае, если у вас есть причина управлять временем жизни объекта вручную. Если вы решите Owned<T>, то вам следует позвонить t.Dispose() самостоятельно - общий шаблон использования заключается в получении зависимости от делегата фабрики:

public class MyClass
{
    private Func<Owned<User>> myDisposableFactory;

    public MyClass(Func<Owned<User>> myDisposableFactory)
    {
        this.myDisposableFactory = myDisposableFactory;
    }

    public void DoSomething()
    {
        using (var disposable = this.myDisposableFactory())
        {
            // ...
            disposable.Dispose();
        }
    }
}

Если вы зарегистрируете тип как ExternallyOwned(), то Autofac не будет распоряжаться каким-либо разрешенным экземпляром, когда заканчивается область действия, содержащая время жизни, - вы можете управлять им.

Взгляните на статью Николаса Блумхардта о времени жизни для получения дополнительной информации.

...