zoukankan      html  css  js  c++  java
  • Unity(三)依赖注入

    Unity具体实现依赖注入包含、属性注入、方法注入。

    构造函数注入

    public void ConStructorCodeTest1()
            {
                //默认注册(无命名),如果后面还有默认注册会覆盖前面的
                container.RegisterType<IClass, CbClass>();
                IClass cb = container.Resolve<IClass>();
                cb.ClassName = "武术 2008级";
    
                container.RegisterType<IStudent, QlinStudent>(new InjectionConstructor(cb,"jay.star"));
    
                IStudent splitClass = container.Resolve<IStudent>();
                //splitClass.Name = "James";
    
                txtResult.Text = splitClass.ShowInfo();
            }
    
    /// <summary>
        /// 班级接口
        /// </summary>
        public interface IClass
        {
            string ClassName { get; set; }
            string ShowInfo();
        }
        /// <summary>
        /// 计科班
        /// </summary>
        public class CbClass : IClass
        {
            public string ClassName { get; set; }
            public string ShowInfo()
            {
                return string.Format("班级名称:{0}", ClassName);
            }
        }
        /// <summary>
        /// 电商班
        /// </summary>
        public class EcClass : IClass
        {
            public string ClassName { get; set; }
            public string ShowInfo()
            {
                return string.Format("班级名称:{0}", ClassName);
            }
        }
    
        /// <summary>
        /// 学生接口
        /// </summary>
        public interface IStudent
        {
            string Name { get; set; }
            //就读班级
            string ShowInfo();
        }
        /// <summary>
        /// 学生
        /// </summary>
        public class QlinStudent : IStudent
        {
            public string Name { get; set; }
            private IClass ToClass { get; set; }
    
            public QlinStudent(IClass _class, string name)
            {
                Name = name;
                ToClass = _class;
            }
            public string ShowInfo()
            {
                return string.Format("{0} 就读班级:{1}", Name, ToClass.ClassName);
            }
        }
    

      

    指定构造函数
    如果构造函数有多个,它也会按照上面那样来初始化一个对象,我们还可以显示用InjectionConstructor特性来指定一个构造函数来解析对象,如下声明:

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

    指定参数依赖的注册名称

    构造函数中IClass参数,如果IUnityContainer注册了多个,默认是使用无名称的那个注册,也可以通过Dependency依赖哪个名称来指定哪个来注册,代码,指定ec名称如下:

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

    下面注册一个名称为ec的映射,如果没有名称ec的映射将报错

    public void ConStructorCodeTest1()
            {
                //默认注册(无命名),如果后面还有默认注册会覆盖前面的
                container.RegisterType<IClass, CbClass>();
                //命名注册
                //container.RegisterType<IClass, EcClass>();//此句将报错
                container.RegisterType<IClass, EcClass>("ec");
                container.RegisterType<IStudent, QlinStudent>();
                //解析默认对象
                IStudent splitClass = container.Resolve<IStudent>();
                txtResult.Text = splitClass.ShowInfo();
            }
    

    指定参数值
    构造器中的参数也可以依赖一个指定的类型值,如下代码依赖于EcClass类型,可以让构造函数中可以传入一个具体的类型,这也是构造函数传参数,如下:

    public static void ConStructorCodeTest1()
            {
                IUnityContainer container = new UnityContainer();
                //默认注册(无命名),如果后面还有默认注册会覆盖前面的
                container.RegisterType<IClass, CbClass>();
                //命名注册
                container.RegisterType<IClass, EcClass>("ec");
                container.RegisterType<IStudent, QlinStudent>(new InjectionConstructor(new CbClass()));
                IStudent splitClass = container.Resolve<IStudent>();
                splitClass.ShowInfo();
            }
    

    来源:http://www.cnblogs.com/qqlin/archive/2012/10/18/2720828.html

  • 相关阅读:
    fabric.js 学习
    前端基础回顾
    ubuntu16 mysql 远程连接
    Django rest_framework API 随笔
    django 学习笔记
    vue 返回上一页在原来的位置
    Django mysql 改用pymysql 驱动
    Material-UI
    设置placeholder的样式
    Cookie、session和localStorage、以及sessionStorage之间的区别
  • 原文地址:https://www.cnblogs.com/xsj1989/p/5810424.html
Copyright © 2011-2022 走看看