About .NET, ASP.NET, MVC, C#, WPF, WCF and everything related to .NET and more.

Mugen Injection [ManagedScopeLifecycle]

ManagedScopeLifecycle - для управление жизненым циклом используется IManagedScope.
Пример использования:

// Create your MugenInjector.
_injector = new MugenInjector();

_injector.Bind<Alpha>().ToSelf().InManagedScope().TryDisposeObjects();
using (var scope = _injector.CreateManagedScope())
{
    var alpha1 = _injector.Get<Alpha>();
    // This is a same instance that alpha1.
    var alpha2 = _injector.Get<Alpha>();

    using (var scope2 = _injector.CreateManagedScope())
    {
        //This is different instance it did not like was alpha1.
        var alpha3 = _injector.Get<Alpha>();
        // This is a same instance that alpha3.
        var alpha4 = _injector.Get<Alpha>();
    }//scope2 will be disposed here.

}//scope1 will be disposed here.
MugenInjection имеет систему типов отношений, которые могут быть использованы для обеспечения возможностей контейнера декларативным способом. Вместо манипулирования IInjector или IManagedScope напрямую, как в приведенном выше примере, типы отношений позволяет компоненту, указать, какой именно компонент необходим, используя декларативный способ.

Managed типа T

Managed экземпляры используются с помощью Managed<T> типа. Managed зависимость может быть уничтожена, когда она больше не нужна. Жизненный цикл Managed обычно соответствуют некоторой единице работы, выполняемой зависимыми компонентами.
// Create your MugenInjector.
_injector = new MugenInjector();

_injector.Bind<Alpha>().ToSelf().InManagedScope().TryDisposeObjects();

var alpha = _injector.Get<Managed<Alpha>>();
//alpha is used for some task
alpha.Value.ToString();

// Here alpha is no longer needed, so
// it is released
alpha.Dispose();

Комбинирование Managed с фабрикой

Жизненный цикл Managed, как правило, используется в сочетании с отношением Func <T>, так что единицы работы могут быть начаты и закончены "на лету".
// Create your MugenInjector.
_injector = new MugenInjector();

_injector.Bind<Alpha>().ToSelf().InManagedScope().TryDisposeObjects();

var factory = _injector.Get<Func<Managed<Alpha>>>();
using (var alpha = factory())
{
    //alpha is used for some task
    alpha.Value.ToString();


    // Here alpha is no longer needed, so
    // it is released
}

Пользовательская реализация Managed

Иногда мы не хотим подключать MugenInjection библиотеку в проект, в этом случае мы можете написать собственную реализацию Managed не зависящую от MugenInjection .
Пример кода:
public class CustomManaged<T> : DisposableObject
{
    #region Fields

    private readonly IBindingContext _bindingContext;
    private readonly object _locker;
    private readonly IManagedScope _managedScope;
    private T _value;

    #endregion

    #region Constructors

    public CustomManaged(IInjector injector, IBindingContext bindingContext)
    {
        _managedScope = injector.CreateManagedScope();
        _bindingContext = bindingContext;
        _locker = new object();
    }

    #endregion

    #region Properties

    public bool IsValueCreated { get; set; }

    public T Value
    {
        get
        {
            if (IsValueCreated)
                return _value;
            lock (_locker)
            {
                if (IsValueCreated)
                    return _value;
                _value = (T)_managedScope.Resolve(_bindingContext);
                IsValueCreated = true;
            }
            return _value;
        }
    }

    #endregion

    #region Overrides of DisposableObject

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            _managedScope.Dispose();
        base.Dispose(disposing);
    }

    #endregion
}

// Create your MugenInjector.
_injector = new MugenInjector();

//Register the CustomManaged<> type
_injector.Components
            .BindingActivatorComponent
            .GetConverter<InjectorWrapperConverter>()
            .InjectorWrapperTypes
            .Add(typeof(CustomManaged<>));

_injector.Bind<Alpha>().ToSelf().InManagedScope().TryDisposeObjects();

//Getting service with custom managed wrapper.
var alpha = _injector.Get<CustomManaged<Alpha>>();
//alpha is used for some task
alpha.Value.ToString();

Комментарии
Оставить комментарий
*bold*
_italics_
+underline+
* Bullet List
** Bullet List 2
# Number List
## Number List 2
{"Do not apply formatting"}
{code:language} code here {code:language}.
Supports: aspx c#, c#, c++, html, sql, xml
[url:http://www.example.com]