Mugen Injection [UnitOfWorkScopeLifecycle]
UnitOfWorkScopeLifecycle - внутри одного контейнера используется только один экземпляр, но в дочерних контейнерах будет создан свой экземпляр.
// Create your MugenInjector. _injector = new MugenInjector(); _injector.Bind<Alpha>().ToSelf().InUnitOfWorkScope(); var alpha1 = _injector.Get<Alpha>(); // This is a same instance that alpha1. var alpha2 = _injector.Get<Alpha>(); using (var child = _injector.CreateChild()) { //This is a different instance. var alpha = child.Get<Alpha>(); //This is a same instance that alpha. var alpha3 = child.Get<Alpha>(); }
UoW типа T
UoW экземпляры используются с помощью UoW<T> типа. UoW зависимость может быть уничтожена, когда она больше не нужна.// Create your MugenInjector. _injector = new MugenInjector(); _injector.Bind<Alpha>().ToSelf().InUnitOfWorkScope().TryDisposeObjects(); var alpha = _injector.Get<UoW<Alpha>>(); //alpha is used for some task alpha.Value.ToString(); // Here alpha is no longer needed, so // it is released alpha.Dispose();
Комбинирование UoW с фабрикой
Жизненный цикл UoW, как правило, используется в сочетании с отношением Func <T>, так что единицы работы могут быть начаты и закончены "на лету".// Create your MugenInjector. _injector = new MugenInjector(); _injector.Bind<Alpha>().ToSelf().InUnitOfWorkScope().TryDisposeObjects(); var factory = _injector.Get<Func<UoW<Alpha>>>(); using (var alpha = factory()) { //alpha is used for some task alpha.Value.ToString(); // Here alpha is no longer needed, so // it is released }
Пользовательская реализация UoW
Иногда мы не хотим подключать MugenInjection библиотеку в проект, в этом случае мы можете написать собственную реализацию UoW не зависящую от MugenInjection .Пример кода:
public sealed class CustomUoW<T> : DisposableObject { #region Fields private readonly IBindingContext _bindingContext; private readonly IInjector _injector; private readonly object _locker; private T _value; #endregion #region Constructors /// <summary> /// Initializes a new instance of the <see cref="CustomUoW{T}" /> class. /// </summary> public CustomUoW(IInjector injector, IBindingContext bindingContext) { _injector = injector.CreateChild(); _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)_injector.Resolve(_bindingContext); IsValueCreated = true; } return _value; } } #endregion #region Overrides of DisposableObject protected override void Dispose(bool disposing) { if (disposing) _injector.Dispose(); base.Dispose(disposing); } #endregion } // Create your MugenInjector. _injector = new MugenInjector(); //Register the CustomUoW<> type _injector.Components .BindingActivatorComponent .GetConverter<InjectorWrapperConverter>() .InjectorWrapperTypes .Add(typeof(CustomUoW<>)); _injector.Bind<Alpha>().ToSelf().InUnitOfWorkScope().TryDisposeObjects(); //Getting service with custom UoW wrapper. var alpha = _injector.Get<CustomUoW<Alpha>>(); //alpha is used for some task alpha.Value.ToString();