将LifetimeManager默认为单例管理器(ContainerControlledLifetimeManager)?

时间:2015-04-23 15:48:02

标签: c# .net unity-container

我使用Unity IoC容器来执行依赖注入。我设计我的系统的想法是,至少对于单个分辨率,层次结构中的所有类型都将表现为单例,即,该层次结构中的相同类型分辨率将导致相同的实例。

但是,我(a)想要扫描我的程序集以查找类型,并且(b)不想明确告诉团结在配置文件中注册类型时要将每种类型解析为单例。

那么,有没有办法告诉团结将所有已注册的映射视为单身?

2 个答案:

答案 0 :(得分:2)

如果有人仍在寻找此...以下扩展名将更改默认值,同时仍允许您覆盖其他管理员:

/// <summary>
/// This extension allows the changing of the default lifetime manager in unity.
/// </summary>
public class DefaultLifetimeManagerExtension<T> : UnityContainerExtension where T : LifetimeManager
{
    /// <summary>
    /// Handle the registering event
    /// </summary>
    protected override void Initialize()
    {
        Context.Registering += this.OnRegister;
    }

    /// <summary>
    /// Remove the registering event
    /// </summary>
    public override void Remove()
    {
        Context.Registering -= this.OnRegister;
    }

    /// <summary>
    /// Handle the registration event by checking for null registration
    /// </summary>
    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<ILifetimePolicy>(lifetimeManager, new NamedTypeBuildKey(e.TypeTo, e.Name));

            if (lifetimeManager is IDisposable)
            {
                Context.Lifetime.Add(lifetimeManager);
            }
        }
    }
}

答案 1 :(得分:0)

您可以在&#39; Lifetime&#39;添加Unity扩展程序。解析管道的阶段,并在其中始终使用ContainerControlledLifetimeManager实例。

编辑:事实上这篇文章有一个确切的例子:

https://unity.codeplex.com/discussions/352179