博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ninject 2.x细说---1.基本使用
阅读量:5239 次
发布时间:2019-06-14

本文共 2831 字,大约阅读时间需要 9 分钟。

本来想使用一下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方法来获得相应的实现。

转载于:https://www.cnblogs.com/Bike/p/3415587.html

你可能感兴趣的文章
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
IOS Google语音识别更新啦!!!
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
BootScrap
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>
selenium学习中遇到的问题
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
架构图-模型
查看>>
黑马程序员_Java基础枚举类型
查看>>
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>
django ORM创建数据库方法
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
知识不是来炫耀的,而是来分享的-----现在的人们却…似乎开始变味了…
查看>>
口胡:[HNOI2011]数学作业
查看>>
数据库锁机制及乐观锁,悲观锁的并发控制
查看>>
03 线程池
查看>>
手机验证码执行流程
查看>>