c# – 两次注册相同类型并仅解析单例的Unity行为

栏目: 后端 · 发布时间: 5年前

内容简介:翻译自:https://stackoverflow.com/questions/18280685/unity-behavior-for-registering-the-same-type-twice-and-resolving-only-the-single

我一直在玩Unity来了解它,并遇到了以下情况.如果我要两次注册相同的类型,但有一个是单例,我怎么能调用Resolve以便只返回单例?我知道这可以使用一个唯一的名称来完成,但我想知道是否可以在没有这个的情况下完成.

例如:

_container.RegisterType<Music>(new InjectionConstructor(new Album("Non-singleton", "Non-singleton")));
_container.RegisterType<Music>(new ContainerControlledLifetimeManager());

并打电话

var music = Factory.Resolve<Music>();

返回’Non-singleton’对象.起初,我认为这是基于注册顺序,但切换我仍然收到’非单身’实例.

是否有一个原因?有没有办法只解决同一容器中两个注册对象的单例类型w / out指定Name属性?

让我们分解一下:

_container.RegisterType<Music>(new InjectionConstructor(
    new Album("Non-singleton", "Non-singleton")));

这将向容器注册没有名称的Music类型(null或default),并告诉Unity使用接受类型Album的构造函数.也始终将新专辑创建的实例(“Non-singleton”,“Non-singleton”)作为音乐(专辑专辑)构造函数的值传递.因此,每个Music实例都会注入相同的Album.

_container.RegisterType<Music>(new ContainerControlledLifetimeManager());

这将根据没有名称的音乐类型(null或默认值)执行注册.因为,没有指定InjectionMembers,对现有注册的唯一更改是添加生命周期管理器.现有注册已更新,因为两个RegisterType调用的BuildKey(类型:音乐,名称:null)相同.

unityContainer.RegisterType<Music>(new InjectionConstructor(new Album("Non-singleton", "Non-singleton")));

unityContainer.RegisterType<Music>(new ContainerControlledLifetimeManager());

var music = unityContainer.Resolve<Music>();
var music2 = unityContainer.Resolve<Music>();

bool areEqual = ReferenceEquals(music, music2);

在上面的areEqual是真的,所以返回一个实例.

Is there a way to Resolve only the singleton type for two registered objects in the same container w/out specifying a Name attribute?

类型按类型和名称注册,因此对同一类型进行多次注册的唯一方法是使用名称:

// Named registration
unityContainer.RegisterType<Music>("NonSingleton Name",
    new InjectionConstructor(new Album("Non-singleton", "Non-singleton")));

// Default (null) registration
unityContainer.RegisterType<Music>(new ContainerControlledLifetimeManager());

现在,如果您想覆盖第一次注册,可以通过指定新的InjectionConstructor来实现.这将清除构建计划并设置构造函数选择策略.

unityContainer.RegisterType<Music>(new InjectionConstructor(
    new Album("Non-singleton", "Non-singleton")));

unityContainer.RegisterType<Music>(new ContainerControlledLifetimeManager(),
    new InjectionConstructor(new Album("singleton", "singleton")));

作为旁注,您通常不会在寄存器类型调用内部对依赖项(在本例中为Album)进行硬编码,除非它确实是一个常量值.即便如此,您可能希望将常量实例注册为单例并让容器为您解析它.

一个有趣的问题是如何在第一次RegisterType调用之后重置构造函数选择策略,以便Unity使用其默认构造函数选择策略.您可以使用清除构造函数选择策略的自定义InjectionMember执行此操作:

unityContainer.RegisterType<Music>(new InjectionConstructor(
    new Album("Non-singleton", "Non-singleton")));

unityContainer.RegisterType<Music>(new ContainerControlledLifetimeManager(),
    new ClearInjectionConstructor());

public class ClearInjectionConstructor : InjectionMember
{
    public override void AddPolicies(Type serviceType, 
        Type implementationType, 
        string name, 
        Microsoft.Practices.ObjectBuilder2.IPolicyList policies)
    {
        policies.Clear<IConstructorSelectorPolicy>(
            new NamedTypeBuildKey(implementationType, name));
    }
}

翻译自:https://stackoverflow.com/questions/18280685/unity-behavior-for-registering-the-same-type-twice-and-resolving-only-the-single


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Where Wizards Stay Up Late

Where Wizards Stay Up Late

Katie Hafner / Simon & Schuster / 1998-1-21 / USD 16.00

Twenty five years ago, it didn't exist. Today, twenty million people worldwide are surfing the Net. "Where Wizards Stay Up Late" is the exciting story of the pioneers responsible for creating the most......一起来看看 《Where Wizards Stay Up Late》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具