• 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

  • 相关阅读:
    $ [Contest #4]$求和 思博题
    洛谷$P1864 [NOI2009]$二叉查找树 区间$dp$
    洛谷$P4045 [JSOI2009]$密码 $dp$+$AC$自动机
    $bzoj2560$ 串珠子 容斥+$dp$
    洛谷$P1600$ 天天爱跑步 树上差分
    $loj526 [LibreOJ eta Round #4]$ 子集 图论
    $CF888G Xor-MST$ 最小生成树
    $bzoj4152 The Captain$ 最短路
    洛谷$P3645 [APIO2015]$雅加达的摩天楼 最短路
    $bzoj4722$ 由乃 搜索
  • 原文地址:https://www.cnblogs.com/xsj1989/p/5810424.html
Copyright © 2020-2023  润新知