zoukankan      html  css  js  c++  java
  • Ninject之使用类型名称注入

    1、在namespace ClassLibrary下定义接口及实现的类:

    public interface IClass {
            void Hello();
        }

        public class Class1 : IClass
        {
            public void Hello()
            {
                HttpContext.Current.Response.Write("Class1::Hello");
            }
        }

        public class Class2 : IClass
        {
            public void Hello()
            {
                HttpContext.Current.Response.Write("Class2::Hello");
            }
        }

    2、定义Module:

    public class Module1 : NinjectModule
        {
            public override void Load()
            {
                //throw new NotImplementedException();
                //Bind<IClass>().To<Class1>();
                Type type = Type.GetType("ClassLibrary.Class1");
                Bind<IClass>().To(type);
            }
        }

        public class Module2 : NinjectModule
        {
            public override void Load()
            {
                Bind<IClass>().To<Class2>();
            }
        }

    Module2采用了硬编码,只能调用Class2的实现方法,而Module1则通过类型参数值“ClassLibrary.Class1”解析为Class1的实现方法,这样做比较灵活,在实际应用中我们可以从配置文件里读取,以确定实现方法

    3、定义Client

    public class Client
        {
            private readonly IClass inst;

            [Inject]
            public Client(IClass cls)
            {
                if (cls == null)
                    throw new ArgumentNullException("cls");
                this.inst = cls;
            }

            [Inject]
            public IClass Cls
            {
                get;
                set;
            }

            public void SayHello()
            {
                this.inst.Hello();
            }
        }

    4、在页面里调用:

    以下代码可以放在页面的Page_Load方法里

    using (IKernel kernel = new StandardKernel(new Module1()))
                {
                    Client client = kernel.Get<Client>();
                    client.SayHello();
                }

                using (IKernel kernel = new StandardKernel(new Module2())) {
                    Client client = kernel.Get<Client>();
                    client.SayHello();

                    client.Cls = kernel.Get<IClass>();
                    client.Cls.Hello();
                }

                using (IKernel kernel = new StandardKernel(new Module1()))
                {
                    IClass cls = kernel.Get<IClass>();
                    cls.Hello();
                }

    前两种将IClass的实现注入到构造函数里,最后一种可以直接得到IClass的实现(通过实现类的名称来动态解析)
  • 相关阅读:
    Word中如何删除目录页的页码
    在java程序代码中打开文件
    Web程序报错:Error instantiating servlet
    将日期类型数据写入到数据库中
    《将博客搬至CSDN》
    软件测试工程师常见的面试题
    我对需求文档的理解
    简单的学生管理系统,实现增删改查
    如何求两个数的最大公约数
    【转载】LoadRunner监控window系统各项指标详解
  • 原文地址:https://www.cnblogs.com/yuanxiaoping_21cn_com/p/2569626.html
Copyright © 2011-2022 走看看