Unity 生命周期管理

于Unity container配置,注册映射关系、类型,单实例、已存在对象和指出一些container的基本配置,这只是我关于Unity的学习心得和笔记,希望能够大家多交流相互学习到更多知识,谢谢大家的支持。

我们可以通过以下两种方法给Unity container中创建映射:

  • RegisterType:这个方法可以往container中注册一种类型或映射关系,当我们需要调用该类型的实例时,container会自动实例化该类型的对象,无需通过new someName方法实例化对象(例如:使用ResolveResolveAll方法获取注册类型的实例),当没有指定实例化对象的生命周期,将使用默认的TransientLifetimeManager(每次调用ResolveResolveAll方法时都会实例化一个新的对象)。
  • RegisterInstance:这个方法是往container中注册一个已存在实例,通过ResolveResolveAll方法获取该类型的实例,默认使用ContainerControlledLifetimeManager管理对象生命周期,而且container中会保持对象的引用(简而言之每次调用ResolveResolveAll方法都会调用同一个对象的引用)。

1.1         注册一个接口或类的映射到具体类型:

使用Register方法可以往容器中注册一种类型或映射关系

  • l         往容器中注册一种类型RegisterType<Type>
  • l         往容器中注册一种映射关系RegisterType< RegisteredType, TargetType >

调用RegisterType<RegisteredType, TargetType>()方法可以往容器中注册一种映射关系,RegisteredType是一个接口或类,而TargetType必需实现该接口或继承该类。

1.2         注册一个单例类或单例类型实例:

涉及到对象的生命周期(Lifetime Managers):

  • l         默认的情况下使用TransientLifetimeManager管理对象的生命周期,以下两种方法效果一样:
  
  
container.RegisterType<IMyService, CustomerService>(); container.RegisterType<IMyService, CustomerService>(new TransientLifetimeManager());
  • l         使用ContainerControlledLifetimeManager创建单例实例
  
  
container.RegisterType<IMyService, CustomerService>(new ContainerControlledLifetimeManager());
  • l         使用ExternallyControlledLifetimeManager只可以保持对象的弱引用
  
  
container.RegisterType<IMyService, CustomerService>(new ExternallyControlledLifetimeManager

关于强引用和弱引用:

强引用:当一个根指向一个对象时,该对象不可能被执行垃圾收集,因为程序代码还在访问该对象。

弱引用:允许垃圾收集器收集对象,同时允许应用程序访问该对象,结果是执行哪个要取决于时间。

  • l         使用PerThreadLifetimeManager在同一个线程返回同一个对象实例,不同线程对象实例不相同 

 

  
  
container.RegisterType<IMyService, CustomerService>(new PerThreadLifetimeManager());

 

在使用RegisterType注册类型或映射,如果对对象生命周期进行,将使用默认的TransientLifetimeManager,它不会在container中保存对象的引用,简而言之每当调用ResolveResolveAll方法时都会实例化一个新的对象。当我们想在container中保存对象的引用的时我们可以使用ContainerControlledLifetimeManager管理对象的生命周期,简而言之每次调用ResolveResolveAll方法都会调用同一个对象的引用。

1.3         注册一个存在对象作为单件实例:

注册一个存在的对象我们使用的是RegisterInstance,它默认使用ContainerControlledLifetimeManager管理对象的生命周期,回顾以下

RegisterType和RegisterInstance区别:

Method

Default Lifetime Managers

Same Lifetime Managers

RegisterType

TransientLifetimeManager

ContainerControlledLifetimeManager

RegisterInstance

ContainerControlledLifetimeManager

ContainerControlledLifetimeManager

RegisterTypeRegisterInstance都使用ContainerControlledLifetimeManager时的区别:

MSDN:If you used the RegisterType method to register a type, Unity creates a new instance of the registered type during the first call to the Resolve or ResolveAll method or when the dependency mechanism injects instances into other classes. Subsequent requests return the same instance.

If you used the RegisterInstance method to register an existing object, Unity returns this instance every time you call the Resolve or ResolveAll method or when the dependency mechanism injects instances into other classes.

翻译:如果使用RegisterType方法注册一种类型,当第一次调用ResolveResolveAll 方法或依赖机制注入一个实例到其他类时,Unity会实例化该注册类型,之后的调用都返回相同实例。

如果使用RegisterInstance方法注册一个存在对象,当我们调用ResolveResolveAll方法或赖机制注入一个实例到其他类时,Unity每次都返回该对象实例。

1.4         使用container的fluent interface属性:

这意味着你可以在一条语句中使用方法链

  
  
IUnityContainer myContainer = new UnityContainer() .RegisterType<IMyService, DataService>() .RegisterType<IMyUtilities, DataConversions>() .RegisterInstance<IMyService>(myEmailService);

由于IUnityContainer 接口实现了IDispose接口,所有我们可以使用Using控制container资源释放

 

复制代码
  
  
////IUnityContainer实现接口IDisposable,所以可以使用 ////using有效释放对象占用的系统资源。 using (IUnityContainer container = new UnityContainer()) { ////实现 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值