IOC容器Unity三种注入总结

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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>
相关文章
|
5月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
4月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
166 3
|
3月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
84 0
|
5月前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
5月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
23天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
180 77
|
1月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
4天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
10天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
66 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
16天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
43 3
实战~如何组织一个多容器项目docker-compose

热门文章

最新文章