内容简介:翻译自: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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
从莎草纸到互联网:社交媒体2000年
[英]汤姆·斯丹迪奇 / 林华 / 中信出版社 / 2015-12 / 58.00元
【内容简介】 社交媒体其实并不是什么新鲜的东西。从西塞罗和其他古罗马政治家用来交换信息的莎草纸信,到宗教改革、美国革命、法国大革命期间印制的宣传小册子,过去人类跟同伴交流信息的方式依然影响着现代社会。在报纸、广播和电视在散播信息上面统治了几十年后,互联网的出现使社交媒体重新变成人们与朋友分享信息的有力工具,并推动公共讨论走向一个新的模式。 汤姆•斯丹迪奇在书中提醒我们历史上的社交网络其......一起来看看 《从莎草纸到互联网:社交媒体2000年》 这本书的介绍吧!