IOC容器Unity三种注入总结

简介: IOC容器Unity三种注入总结

一、构造函数注入

1、指定生成构造函数

  当一个类有多个构造函数,想要生成指定的构造函数,需要添加如下代码:

        public QlinStudent()
        {
        }
        [InjectionConstructor]//指定生成这个带参的构造函数
        public QlinStudent(IClass _class,string name)
        {
            ToClass = _class;
            Name = name;
        }

2、指定参数依赖的注册名称

  如果IClass 注册多个类型时,用默认(无名)注册就容易被覆盖,但也可以通过Dependency依赖哪个名称来指定哪个来注册。

        [InjectionConstructor]//指定生成构造函数
        //[Dependency("ec")]指定注册名称ec
        public QlinStudent([Dependency("ec")]IClass _class)
        {
            ToClass = _class;
        }

  最好给每一个注册添加唯一的名字,下面注册一个名称为ec的映射,如果没有名称ec的映射将报错。

  IUnityContainer container = new UnityContainer();
  //默认注册(无命名),如果后面还有默认注册,就会覆盖前面的默认注册
  container.RegisterType<IClass, CbClass>();
  //命名注册
    container.RegisterType<IClass, EcClass>("ec");

  如果用配置文件,只要再添加一个name

<register type="IClass" name="ec" mapTo="EcClass"/>

3、指定参数值

  构造函数中的参数,可以以类为类型。如下代码可以让构造函数中传入一个具体的类型。

container.RegisterType<IStudent, QlinStudent>(new InjectionConstructor(new CbClass()));

  或者注册一个实例对象,如下:

  IClass cbClass = new CbClass { ClassName="计科051班" };
  //实例注册命名实例
  container.RegisterInstance<IClass>("ec", cbClass);

  配置文件也可以指定类型依赖,如下,指定EcClass:

  <register type="IStudent"  mapTo="QlinStudent">
        <constructor>
          <param name="_class" type="IClass">
            <dependency  type="EcClass"/>
          </param>
        </constructor>
      </register>

  构造函数中有两个参数时如何呢?

        [InjectionConstructor]
        public QlinStudent([Dependency("ec")]IClass _class, string name)
        {
            ToClass = _class;
            Name = name;
        }

  多一个参数name,就要为容器IUnityContainer提供这个参数,没有这个原材料,它无法构造就会报错,如下代码:

container.RegisterType<IStudent, QlinStudent>(new InjectionConstructor(new CbClass() { ClassName = "计科051" }, "Qlin"));

  注入参数后,也可以下次解析的时候,通过ParameterOverrides类来覆盖原来的参数,改变参数值,如下:

//覆盖参数解析
IStudent student1 = container.Resolve<IStudent>(new ParameterOverrides(){{"_class",new EcClass(){ ClassName="电商051"}},{"name","linq"}});

二、属性注入

1、指定参数值

  属性注入就是Unity容器解析对象时,为属性赋值。要求用Public修饰属性,只需要在需要注入的属性上方加上一个Dependency特性。属性注入也是伴随着类型初始化时注入的,在解析时自动注入。

  代码如下,在ToClass属性上增加了Dependency特性,来表示这个属性需要注入:

  //Dependency指定一个注册名称name参数用来指定注入对象的名称
  [Dependency("ec")]
  public IClass ToClass { get; set; }

  配置文件方式:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <!--引用命名空间-->
    <namespace name="ConsoleApplication1.UnityDemo.Constructor4" />
    <!--引用程序集-->
    <assembly name="ConsoleApplication1" />
    <!--容器-->
    <container name="FirstClass">
      <!--映射关系-->
      <register type="IClass"  mapTo="CbClass">      
      </register>
      <register type="IClass" name="ec1" mapTo="EcClass">
        <!--设置属性名,属性类型,属性值-->
        <property name="ClassName" propertyType="System.String" value="电商051" />
      </register>
      <register type="IStudent"  mapTo="QlinStudent">
        <property name="ToClass">
          <!--可指定注册时注册的名称-->
          <dependency name="ec1" type="EcClass"/>
        </property>
      </register>
    </container>
  </unity>

三、方法注入

1、指定参数值

  方法注入是为了给方法传递参数,与构造函数注入的代码相似:

    public class QlinStudent : IStudent
    {
        public string Name { get; set; }
        private IClass ToClass { get; set; }
        [InjectionMethod]//表示该方法需要被注入
        public void InitClass(IClass _class)
        {
            ToClass = _class;
        }
        public void ShowInfo()
        {
            Console.WriteLine("{0}就读班级:{1}", Name, ToClass.ClassName);
        }
    }

 编程方式注入不变,就是初始化时注入值。

container.RegisterType<IStudent, QlinStudent>();

  配置文件方式:

      <register type="IStudent"  mapTo="QlinStudent">
        <property name="Name" propertyType="System.String" value="Qlin" />
        <!--被注入的方法-->
        <method name="InitClass">
          <param name="_class" type="IClass">
            <!--可指定注册时注册的名称-->
            <dependency name="ec1" type="EcClass"/>
          </param>
        </method>
      </register>
相关文章
|
9月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
394 18
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
1054 3
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
373 0
|
10月前
|
机器学习/深度学习 人工智能 图形学
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
746 9
|
10月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
1607 6
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
1964 6
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
1361 4

热门文章

最新文章