首页 > 其他分享 >微软企业库Unity学习笔记(一)

微软企业库Unity学习笔记(一)

时间:2024-01-13 20:16:18浏览次数:35  
标签:Resolve container RegisterType 对象 微软 ResolveAll Unity 实例 企业库

微软企业库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方法注册一种类型,当第一次调用Resolve 或ResolveAll 方法或依赖机制注入一个实例到其他类时,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())

{

////实现

}

标签:Resolve,container,RegisterType,对象,微软,ResolveAll,Unity,实例,企业库
From: https://www.cnblogs.com/sexintercourse/p/17962839

相关文章

  • 微软企业库Unity学习笔记(二)
    微软企业库Unity学习笔记(二) 接下来介绍一下依赖注入的方式:构造函数注入属性注入方法注入一、构造函数注入我们将介绍单构造函数和多构造函数注入1)单构造函数使用自动注入单构造函数自动注入,这里我们使用一个简单的例子具体类MyObject依赖于具体类MyDependentC......
  • 如何让Visual Studio Tools for Unity插件用于调试你自己的Mono嵌入应用程序
       最近在测试将mono嵌入到C++应用程序中,苦于没有调试器,有时候还是不怎么方便。网上搜了一下,有VS插件MDebug、VSMonoDebugger,实际试用了一下,有点麻烦,而且似乎对Windows+VisualStudio2022支持不大好。因此想到了,Unity引擎是基于mono的,VisualStudio2022也内置了针对Unity的......
  • Unity 获取当前系统时间并在UI界面中显示
    在Unity3D中获取当前系统时间,并在UITEXT中显示 代码:usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingSystem;usingTMPro;usingUnityEngine.UI;usingUnityEngine.SceneManagement;publicclassTIME_show:MonoBehaviou......
  • Unity3D 性能杀手Overdraw详解
    前言Unity3D是一款强大的游戏开发引擎,但在使用过程中,我们需要注意一些可能会影响游戏性能的因素。其中之一就是Overdraw(过度绘制),它可以成为性能杀手。本文将详细解释Overdraw的概念、原因以及如何通过代码实现来减少Overdraw对游戏性能的影响。对惹,这里有一个游戏开发交流小组,希......
  • DOTS Unity.Physics物理引擎碰撞查询核心分析
    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞查询以及核心相关概念。Unity.Physics碰撞查询概述 碰撞查询(CollisonQurey)是Unity.Physics物理引擎中的一个很重要的功能。很多游戏逻辑都需要基于碰......
  • Unity DOTS物理引擎的核心分析与详解
    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们来给大家分享和介绍一下这个物理引擎的使用。Unity.Physics的设计哲学 Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现,  包含了物理刚体的迭代计算与碰撞检测等查询。Unity.P......
  • Unity3D 最后一次drawcall 如何避免详解
    Unity3D是一款广泛使用的游戏开发引擎,它基于C#编程语言,可以实现跨平台的游戏开发。在Unity3D中,drawcall是一个非常重要的概念,它指的是渲染引擎每次渲染物体时所调用的函数。过多的drawcall会导致游戏性能下降,因此我们需要采取一些措施来避免过多的drawcall。对啦!这里有个游戏开发......
  • Unity3D 如何把全部游戏逻辑都放到lua层实现详解
    Unity3D是一款非常流行的游戏开发引擎,它支持C#、JavaScript和Boo等脚本语言。然而,有时候我们可能希望将全部游戏逻辑都放到Lua层实现,这样可以更方便地进行游戏逻辑的修改和调试。本文将详细介绍如何使用Unity3D将全部游戏逻辑都放到Lua层实现。对啦!这里有个游戏开发交流小组里面......
  • Unity3D 在移动端的性能优化指标怎样才算合理方面详解
    Unity3D是一款非常强大的跨平台游戏开发引擎,它能够在不同的平台上实现高质量的游戏开发。然而,在移动端上,由于硬件性能的限制,需要进行一定的性能优化才能保证游戏的流畅运行。本文将详细介绍Unity3D在移动端性能优化方面的指标和技术,并给出相关的代码实现。对啦!这里有个游戏开发交......
  • Unity3D 原始对象和占位对象详解
    Unity3D是一款强大的跨平台游戏引擎,提供了丰富的功能和工具,方便开发者创建各种类型的游戏。在Unity3D中,原始对象和占位对象是两个重要的概念。本文将详细介绍原始对象和占位对象的概念、技术详解以及代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小......