将LifetimeManager默认为单例管理器(ContainerControlledLifetimeManager)?
我正在使用Unity IoC容器来执行dependency injection。 我设计我的系统的想法是,至少对于单个分辨率,层次结构中的所有类型都将表现为单例,即,该层次结构中的相同类型分辨率将导致相同的实例。
但是,我(a)想要扫描我的程序集以查找类型,并且(b)不希望明确告诉团结在配置文件中注册类型时将每个类型解析为单例。
那么,有没有办法告诉团结将所有已注册的映射视为单例?
如果有人还在寻找这个…以下扩展名将更改默认值,同时仍然允许您覆盖其他一些经理:
/// /// This extension allows the changing of the default lifetime manager in unity. /// public class DefaultLifetimeManagerExtension : UnityContainerExtension where T : LifetimeManager { /// /// Handle the registering event /// protected override void Initialize() { Context.Registering += this.OnRegister; } /// /// Remove the registering event /// public override void Remove() { Context.Registering -= this.OnRegister; } /// /// Handle the registration event by checking for null registration /// private void OnRegister(object sender, RegisterEventArgs e) { if (e.LifetimeManager == null) { var lifetimeManager = (LifetimeManager)Activator.CreateInstance(typeof (T)); // Set this internal property using reflection lifetimeManager .GetType() .GetProperty("InUse", BindingFlags.NonPublic | BindingFlags.Instance) .SetValue(lifetimeManager, true); Context.Policies.Set(lifetimeManager, new NamedTypeBuildKey(e.TypeTo, e.Name)); if (lifetimeManager is IDisposable) { Context.Lifetime.Add(lifetimeManager); } } } }
您可以在解析管道的“生命周期”阶段添加Unity扩展,并在其中始终使用ContainerControlledLifetimeManager实例。
编辑:事实上这篇文章有一个确切的例子: