ASP.NET MVC进阶之路:依赖注入(Di)和Ninject

0X1 什么是依赖注入

  依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点。在程序运行过程中,客户类不直接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行。

                                                      图1

  如图1所示,数据库操作类DataManager中依赖的IDataBase的接口,而不是以来IDataBase的具体实现类,这样的好处是可以让我们的程序具有扩展性:无论我们要使用SqlServer当我们的数据库操作类还是用Mysql,我们需要改动的地方都很少。

0X2 一个Demo理解Di

  我们创建一个控制台程序,并按照图1中所标识的关系创建四个类。

public class DataManager
    {
        private IDataBase _database;
        public DataManager(IDataBase database)
        {
            this._database = database;
        }

        public void Add()
        {
            _database.Add();
        }

        public void Delete()
        {
            _database.Delete();
        }

        public void Update()
        {
            _database.Update();
        }

        public void Select()
        {
            _database.Select();
        }
    }

IDataBase接口

public interface IDataBase
    {
        string DbName { get; }
        void Select();
        void Update();
        void Delete();
        void Add();
    }
public class SqlServer : IDataBase
    {
        public string DbName
        {
            get
            {
                return "SqlServer";
            }
        }

        public void Add()
        {
            Console.WriteLine("Add in " + DbName);
        }

        public void Delete()
        {
            Console.WriteLine("Delete in " + DbName);
        }

        public void Select()
        {
            Console.WriteLine("Select in " + DbName);
        }

        public void Update()
        {
            Console.WriteLine("Update in " + DbName);
        }
    }

  

public string DbName
        {
            get
            {
                return "Mysql";
            }
        }

        public void Add()
        {
            Console.WriteLine("Add in " + DbName);
        }

        public void Delete()
        {
            Console.WriteLine("Delete in " + DbName);
        }

        public void Select()
        {
            Console.WriteLine("Select in " + DbName);
        }

        public void Update()
        {
            Console.WriteLine("Update in " + DbName);
        }

如果我们要用Sqlserver作为数据库实现类的话,传统写法我们要New Sqlserver,如下图:

项目早期使用的是Sqlserver数据库没问题,后来BOSS忽然要改成Mysql数据库,你心里面一想,没问题啊,无非就是把New后面的Sqlserver换成Mysql嘛,简单。于是你就开始改,越改越不对劲,已经你已经发现当前项目已经有好几十个地方用到New Sqlserver(),而剩余的数量往往还是未知的。这个时候你就在想,有没有方法可以让我只需要改一个地方其他地方不用动就可以呢?答案是肯定的,目前这种方法实现有很多种,最简单的无非就是工厂模式。但是,今天,我们不用工厂,我们将使用Ninject来实现这种功能。

0X3 Ninject的使用

  Ninject是一个IOC容器,用来解决程序中组件的耦合问题,它的目的在于做到最少配置。其他的的IOC工具过于依赖配置文件,需要使用assembly-qualified名称来进行定义,庸长且复杂常常因为打错字而破坏程序。这些是他的优点,也是为什么要选择它。

  

安装Ninject

  打开Nuget程序包管理控制台输入“Install-Package Ninject”即可安装Ninject。

  

Ninject使用步骤

  我们一般会在程序启动的入口来创建Ninject的对象负责类型的注册。

1  static void Main(string[] args)
2         {
3             //实例化Ninject对象
4             IKernel Kerner = new StandardKernel();
5         }

  使用Ninject对象分两个步骤,第一步是把接口对象或者说被依赖的对象(IDataBase)绑定到Ninject中,然后在为其绑定对应的实例类型(如果要使用SqlServer则就绑定SqlServer)。

 //实例化Ninject对象
 IKernel Kerner = new StandardKernel();
 //绑定对象
 Kerner.Bind<IDataBase>().To<SqlServer>();

  第二步则是通过Ninject的Get方法获取IDataBase的实现类

 var Db = Kerner.Get<IDataBase>(); //由于上面IDataBase绑定的是SqlServer类型,所以这里获取的类型是SqlServer

  上面的代码大家可能体会不到使用Ninject的好处,也没有体会到依赖注入的奥妙所在。依赖注入大致分为三类:接口注入,函数注入,属性注入。我们来通过一个例子来演示属性注入。

  我们增加一个IShowDBInfo的接口类,其有一个Show方法。然后添加一个Show类实现IShowDBInfo接口:

 public class Show1 : IShowDBInfo
    {
        public void Show()
        {
            Console.WriteLine(this.GetType().FullName);
        }
    }

我们给DataManager添加一个IShowDBInfo属性并增加一个Show()方法:

 public class DataManager
    {
        private IDataBase _database;
        private IShowDBInfo _showDbInfo;
        public DataManager(IDataBase database, IShowDBInfo ishowdbinfo)
        {
            this._database = database;
            _showDbInfo = ishowdbinfo;
        }
       //省略Add,Updata,Delete,Select方法
        public void Show()
        {
            _showDbInfo.Show();
        }
    }     

  在应用程序启动的时候注册IShow类和注册DataManager类并启动程序:

 static void Main(string[] args)
        {
            //实例化Ninject对象
            IKernel Kerner = new StandardKernel();
            //绑定对象
            Kerner.Bind<IDataBase>().To<SqlServer>();
            Kerner.Bind<IShowDBInfo>().To<Show1>();
            Kerner.Bind<DataManager>().ToSelf();
            var dataManager=Kerner.Get<DataManager>();
            dataManager.Show();
            Console.Read();
        }

  从上代码以及运行结果来看,我们只需要在向Ninject实例里面注册对象,然后在其他类中使用的时候我们只需要定义接口就可以了,并不需要实例化对象。这样做的话可以使我们和其他层进行松耦合。

时间: 2024-12-26 18:03:41

ASP.NET MVC进阶之路:依赖注入(Di)和Ninject的相关文章

MVC进阶之路:依赖注入(Di)和Ninject

MVC进阶之路:依赖注入(Di)和Ninject 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点.在程序运行过程中,客户类不直接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行. 图1 如图1所示,数据库操作类DataManager中依赖的IDataBase的接口,而不是以来IDataBase的具

依赖注入(DI)和Ninject,Ninject

我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种“需要”,就称为DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,Inversion of Control )是一个意思. DI是一种通过接口实现松耦合的设计模式. 依赖注入(DI)和Ninject Ninject简介

ASP.NET MVC进阶之路:深入理解依赖注入(DI)和控制反转(IOC)

0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点.在程序运行过程中,客户类不直接实例化具体服务类实例,而是客户类的运行上下文环境或专门组件负责实例化服务类,然后将其注入到客户类中,保证客户类的正常运行.详细的介绍可以阅读上一篇博文:http://www.cnblogs.com/dazhuangtage/p/5672190.html 0X2 什么是控制反转 在解释什么是控

ASP.NET MVC进阶之路:深入理解Controller激活机制并使用Ioc容器创建对象

本文标题说是"深入理解Controller"其实有点“标题党”的味道了.本篇只会探讨"Controller"的激活机制,也就是如何创建Controller的并调用的.本篇不是讲解Controller底层相关知识,不过后期博文会对其进行介绍. 0X1 DefaultControllerFactory DefaultControllerFactory对象可以说是Controller创建激活的一个重要类,在默认情况下(这里的默认情况指没有向MVC指定负责创建Control

[ASP.NET MVC 小牛之路]05 - 使用 Ninject实现依赖注入

在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来演示Ninject在ASP.NET MVC中的应用. 为了更好的理解和撑握本文内容,强烈建议初学者阅读本文前先阅读依赖注入(DI)和Ninject. 本文目录: 准备工作 新建一个名为BookShop的空白解决方案.在该解决方案中分别添加一个名为BookShop.WebUI的MVC空应用程序,和一个

[ASP.Net] 转 &gt; ASP.NET MVC 小牛之路

URL: http://www.cnblogs.com/willick/ 看到了不错的学习笔记,MVC.Net学习之路展开 [ASP.NET MVC 小牛之路]18 - Web API [ASP.NET MVC 小牛之路]17 - 捆绑(Bundle) [ASP.NET MVC 小牛之路]16 - Model 验证 [ASP.NET MVC 小牛之路]15 - Model Binding [ASP.NET MVC 小牛之路]14 - Unobtrusive Ajax [ASP.NET MVC 小

ASP.NET Core中使用自定义MVC过滤器属性的依赖注入

原文:ASP.NET Core中使用自定义MVC过滤器属性的依赖注入 除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的MVC过滤器之一是  ExceptionFilterAttribute,用于处理Wep API应用程序中的错误响应.它很容易实现,开发人员和我在ASP.NET Core中使用MVC过滤器属性所面临的问题是访问Startup.cs类

[ASP.NET MVC 小牛之路]18 - Web API

原文:[ASP.NET MVC 小牛之路]18 - Web API Web API 是ASP.NET平台新加的一个特性,它可以简单快速地创建Web服务为HTTP客户端提供API.Web API 使用的基础库是和一般的MVC框架一样的,但Web API并不是MVC框架的一部分,微软把Web API相关的类从 System.Web.Mvc 命名空间下提取了出来放在 System.Web.Http 命名空间下.这种理念是把 Web API 作为ASP.NET 平台的核心之一,以使Web API能使用在

[ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但足矣.要深入研究还需要去查看更多的专业资料. 要成为大牛,必然要有扎实的基本功,不然时间再长项目再多也很难有大的提升.本系列讲的C# 高级知识点,是非常值得去撑握的,不仅可以让你写代码时游刃有余,而且去研究和学习一些开源项目时,也不会显得那么吃力了. 希望大家记住,这里讲的所有的知识点,不仅仅是了解