系统学习MVC3搭建网站(4)--利用NuGet安装Ninject.MVC3实现依赖注入(DI)

通过一个简单的文章系统学习MVC3+Linq搭建网站:

(1)数据库建模 (2012-03-23 12:10)

(2)如何利用系统自带的用户系统 (2012-03-28 22:41)

(3) 项目文件结构介绍 (2012-04-04 15:41)

(4) 通过NuGet安装Ninject.MVC3实现依赖注入(DI)。 (2012-04-05 22:51)

源码   数据库创建sql   本示例DEMO

 

这一节的内容中,要实现的是:使用NuGet安装Ninject.MVC3实现该项目程序控制层Controllers与模型层Models之间的依赖注入(DI)。

这里面有3个概念,接下来我会依次予以说明。

1.依赖注入
2.Ninject.MVC3
3.NuGet


1.什么是依赖注入?
依赖注入(Dependency Injection,简称DI),通常还会有控制反转(Inversion of Control,简称IoC),依赖倒置(Dependency Inversion Principle),基本上他们算是一回事,伴随着的还有“耦合","解耦"的概念。“耦合"是一个什么样的表现?我们回到上一节末尾的代码。

Models层,分别定义了一个IServices.cs接口,以及接口方法实现类ServiceImpl。

    public interface IServices
{
string xxx();
}

public partial class ServiceImpl : IServices
{
public string xxx(){xxxxx;};
}

 

Controllers层,需要调用Models的方法:

        public IServices cmsService { get; set; }

protected override void Initialize(RequestContext requestContext)
{
if (cmsService == null) { cmsService = new ServiceImpl(); }
base.Initialize(requestContext);
}

 

在Controllers层定义了一个IServices接口类型对象,然后New一个ServiceImpl实例。这里也确实体现了面向接口编程的概念,假如除了ServiceImpl外,还有ServiceWebServiceImpl,ServiceWebWCFImpl,ServiceJSONImpl等其它IServices接口实现类。需要更改数据的实现方式时,则只需要New对应的类的实例即可。

糟糕的是我们必须回到每一个控制器页面来修改它们。显然这很麻烦。类与类之间的调用关系称为“依赖”,把这种通过new一个类的实例实现调用的方式称之为“硬编码”,那么,“依赖注入”所要解决的的问题就是取代这种硬编码的方法,把耦合的代码解耦,把彼此的依赖关系从程序中剥离出来,放到一个第三方对象中,我们把这个第三方对象称为IoC容器,通过IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。


Ninject就是接下来要介绍的IoC容器,一个依赖注入实现工具。

首先需要安装Ninject插件。这里先引入另外一个工具NuGet

传统的添加dll的方式是先下载,解压,然后添加引用。如果只是一个dll文件看起来也没有多麻烦,但有时候一个功能可能会涉及到多个dll文件,甚至其它cs文件等,这时候传统的方式就会比较麻烦。如果采用NuGet,它具备下面的一些优点:

1.dll的配置可以自动添加
2.添加一个dll后,它会自动把相关联的dll给添加到引用中来
3.当有新的版本出现时可以自动更新dll
4.如果需要在web.config中添加一些配置属性,它会自动完成

事实上,从我们开始接触MVC3起就已经在接触NuGet了。你可能会疑惑在我们的解决方案文件夹下里面有一堆jquery系列,EntityFramework等文件夹的packages目录是干什么的?他们就是NuGet安装包,.nupkg后缀的压缩文件包含了该插件安装的所有文件。

 

操作:
(1)点击Package Manager Console

如果你看不到这个选项,请首先安装nuget
http://www.nuget.org/
http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c

如果安装后提示Error: The Package Manager Console requires PowerShell 2.0 runtime.....

到这个地址下载安装 Windows 管理框架, Windows7中,默认已经包含了这个软件,如果你是其它系统,则可能需要安装。
http://support.microsoft.com/kb/968929
(这个下载的链接不太好找,我放个图,“本页”的位置需要展开)


回到Package Manager Console

这里有两个下拉框,第一个是package源,现在看到的是ALL跟Nuget official package source两个选项,可以点击旁边的Setting图标配置更多的package源,可以是url,也可以我们的本地计算机(服务器)目录(比如前面提到的那个packages目录),这里我不做太多延伸。第二个下拉框就是需要导入插件的项目。需要注意的是,这里默认的是解决方案里的第一个项目,而不是打开Package Manager Console时的当前选中项目。


(2)查找以及安装

下面列出的几个简单的命令,更多的操作可以去Nuget网站上学习。这里其实只需要用到 install-package Ninject.MVC3

1.列出所有插件---会列出N多的可用插件来
Get-Package -ListAvailable

2.关键字过滤
Get-Package -Filter Ninject.MVC3 -ListAvailable

3.安装
install-package Ninject.MVC3

安装成功后,会自动在项目中添加了3个Ninject.MVC3相关的dll文件引用,以及添加了一个App_Start文件夹,其中生成了一个NinjectMVC3.cs代码文件


这个NinjectMVC3.cs文件即是实现“配置依赖”的位置。NinjectMVC3.cs代码:

View Code

 

实现“依赖注入”,非常简单。
(1)NinjectMVC3.cs的RegisterServices方法中注册依赖关系:

(2)修改控制器中代码:

实现依赖注入后,如果以后有新的需求,例如需要把IServices接口实现由ServiceImpl更改为ServiceWCFImpl,就只需要更改NinjectMVC3.cs文件中的一个地方就可以了。而不用再去修改控制器中的代码。
 

posted on 2012-04-06 10:47  xiaogang_self  阅读(1962)  评论(2)    收藏  举报

导航