zoukankan      html  css  js  c++  java
  • Ninject 2.x细说1.基本使用

    本来想使用一下Ninject的,然后搜索了很久,都没找到比较详细的关于Ninject的使用方法等内容.于是乎干脆自己来写几篇介绍Ninject的内容.

    1.      依赖注入和IOC

    依赖注入和IOC的概念,可以点击这里看之前的文章.在这里就不多介绍了.

    2.      环境准备

    Ø 开发环境:WIN7 + VS2010 SP1

    Ø Ninject:本节内容以Ninject2.2.0.0-release-net-4.0为基础进行介绍。可以点击这里打开Ninject的官网进行下载。需要说明的是,CodePlex上虽然也有Ninject项目,但其基本没怎么更新。所以就不要从那里下载了。直接到Ninject其官方网站下载吧。

    3.简单的例子

    Ø 需求描述:

    系统有任务消息,每个任务消息都有消息号,消息号的产生可以是以配置文件中的基数为基础产生,也可以是根据数据库中的某个字段产生。

    Ø 步骤:

    1).定义一个消息接口:

    public interface IMessage

        {

            /// <summary>

            /// 取得消息号

            /// </summary>

            /// <returns></returns>

            string GetMsgNumber();

        }

    2).从配置文件中获取消息号,实现消息接口。代码如下:

    public class MessageFile : IMessage

        {

            public string GetMsgNumber()

            {

                return "从文件中获取消息号!";

            }

        }

    3).从数据库中获取消息号,实现消息接口。代码如下:

    public class MessageDB : IMessage

        {

            public string GetMsgNumber()

            {

                return "从数据中读取消息号";

            }

        }

    4).下面就是准备在我们的应用中注册的接口和接口实现了。代码如下:

    using Ninject.Modules;

    public class MessageModule : NinjectModule

        {

            public override void Load()

            {

                //绑定接口并指定接口的实现。

                Bind<IMessage>().To<MessageDB>();

            }

        }

    通过代码我们可以看到,我们只需要继承自NinjectModule并重载其Load()方法,在Load()方法中进行绑定接口并指定其具体实现即可。

    5).接着,就是具体的使用了,代码如下:

    using Ninject;

    static void Main(string[] args)

            {

                using (var kernal = new StandardKernel(new MessageModule()))

                {

                    var msg = kernal.Get<IMessage>();

                    var msgNo = msg.GetMsgNumber();

                    Console.WriteLine(msgNo);

                    Console.Read();

                }

            }

    运行代码(注意:在运行代码之前,请将项目的Framework选择中4.0版本,否则会“未能解析引用的程序集“Ninject”,因为它对不在当前目标框架“.NETFramework,Version=v4.0,Profile=Client”中的“System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”具有依赖关系“异常出现),最后我们可以看到,控制台打出的消息是:

    从数据中读取消息号!

     

    在代码中,我们通过KernalGet方法来取得相应的类型实例,在这整个代码过程中,我们只是在Module中绑定了接口和实现,然后在其他地方都是通过接口类型来实现代码的。如何需要换成从配置文件中获取消息号,则只需要修改自定义的Module中的代码即可。毫无疑问,在程序的类型依赖和耦合方面都有很多优点

    4.接下来,介绍使用Ninject进行依赖注入的几种方式。

    Ø 构造函数注入

    首先,定义使用依赖接口初始化的类, 具体如下:

    public class MessageCfg

        {

            private readonly IMessage msg;

            /// <summary>

            /// 通过接口构造

            /// </summary>

            /// <param name="msg"></param>

            public MessageCfg(IMessage msg)

            {

                this.msg = msg;

            }

     

            public string GetMsgNumber()

            {

                return this.msg.GetMsgNumber();

            }

        }

    然后,我们的代码就可以这样写了:

    using (var kernal = new StandardKernel(new MessageModule()))

                {

                    var msg = kernal.Get<IMessage>();

                    var msgcfg = new MessageCfg(msg);//构造函数注入

                    Console.WriteLine(msgcfg.GetMsgNumber());

                    Console.Read();

                }

    这里,我们可以初始化MessageCfg的时候,只需要使用kernal.Get<IMessage>()获取的类型即可,而不用关心其具体是什么。

    Ø 属性注入

    首先定义使用属性注入的类,具体如下:

    public class MessageCfg

        {

           //定义接口属性

            public IMessage Msg { get; set; }

            public MessageCfg() { }

            public string GetMsgNumber()

            {

                return this.Msg.GetMsgNumber();

           }

        }

    具体使用代码如下:

    using (var kernal = new StandardKernel(new MessageModule()))

                {

                    //属性注入

                    var msgcfg = new MessageCfg() { Msg = kernal.Get<IMessage>() };

                    Console.WriteLine(msgcfg.GetMsgNumber());

                    Console.Read();

                }

    其他几种注入都大同小异,使用方式差不多。

    最后,我们可以看到使用Ninject的基本步骤很简单。只需要定义接口à实现接口à继承NinjectModule在其Load()方法中指定相应的绑定接口和接口实现à通过自己的Module的来初始化Kernalà通过Get方法来获得相应的实现。

     
         本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    net core 使用 rabbitmq
    asp.net core WebApi 返回 HttpResponseMessage
    asp.net core 2.1 WebApi 快速入门
    JQuery EasyUI combobox动态添加option
    php截取字符去掉最后一个字符
    JQuery EasyUI Combobox的onChange事件
    对于不返回任何键列信息的 selectcommand 不支持 updatecommand 的动态 sql 生成
    Access2007 操作或事件已被禁用模式阻止解决办法
    Easyui 中 Tabsr的常用方法
    Win 7 IE11不能下载文件,右键另存为也不行
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/2433005.html
Copyright © 2011-2022 走看看