最近学习MVC 看到很多文章都用了Ninject框架进行解耦,就考虑是否能用在平时写的WCF服务中,因为毕竟目前还是总要写服务的……蛋疼ing……

传送门:

Ninject框架官网:

http://www.ninject.org/download.html

目前最新版本是3.0,另外需要下载WCF相关的扩展

Ninject 入门:

http://www.touchsunlight.com/coding/59.html

WCF 入门:

园子里找A大吧……

以下为正文,请大家耐心围观,不要高呼No Picture&Code You Say a JB…… 最后会提供DEMO下载

现在我们来看一个场景

我想服务有一个行为,可以返回一段字符串,我们可以直接定义这个服务行为如下

[ServiceContract]
public class MessageService
{ [OperationContract] public string GetMessage() {return "Hello World";}
}

但是这样不好,我不一定返回的就是Hello World这条消息,于是我们定义了一个接口,所有实现这个接口的类型都拥有返回消息的能力

public interface IMessageProvider
{string GetMessage();
}

public class DefaultMessageProvider:IMessageProvider
{public string GetMessage(){return "Hello World";}
}

在服务里这么用

[ServiceContract]
public class MessageService
{private IMessageProvider provider=null;public MessageService(IMessageProvider provider){this.provider=provider}[OperationContract] public string GetMessage() {return provider.GetMessage()}
}

我们的想法是美好的,但现实是残酷的,在对服务请求时,服务的实例,是由WCF管道创建的,我们无法手动new一个新的MessageService实例,也就代表我们无法通过构造函数向MessageService中注入IMessageProvider真正的实现类。

这时候,我们就要利用Ninject通过查找关系映射列表,自动创建合理的依赖项实例这个特性了。

这里简单介绍下Ninject框架的几个基本知识

Ninject 内核Kernel 是整个Ninject框架的主入口点,也是关系列表的容器。

我们可以通过IKernel kernel=new StandardKernel()来创建一个容器对象;

Kernel通过Bind<T>.To<T>语法建立接口与实例间的关系,例如:kernel.Bind<IMessageProvider>().To<DefaultMessageProvider>();

在建立接口与实现类之间的关系后,我们可以通过kenrel的Get<T>()方法来获取正确的对象实例,例如:IMessageProvider provider= kernel.Get<IMessageProvider>();

这里我们获取到的对象实例为DefaultMessageProvider的实例。

kernel对象在使用Get<T>()获取类型的实例时,会检查类型所有依赖项,并提供合理的值,我们看这个例子

public Interface IA
{void Todo();
}public Interface IB
{void Todo();
}Public Class A:IA
{public void Todo(){ // Todo}
}public Class B:IB
{private IA a;public B(IA a){this a = a;}public void Todo(){a.Todo();}
}public static Class Program
{public static void Main(){IKernel kernel=new StandardKernel();kernel.Bind<IA>().To<A>();kernel.Bind<IB>().To<B>();IB b=kernel.Get<IB>();b.Todo();}
}

在这个例子中IB的实现类,依赖于IA的实现,并且使用构造函数的方式进行了依赖注入。

我们通过kernel.Get<IB>()时,会查找并创建B类型的实例,同时检查发现B类依赖于IA接口,NInject会继续检查关系列表中是否存在IA的映射,并创建合理的实例。

最终返回B类型的实例,并且通过构造函数注入实现IA接口的类型的实例。

现在,我们来看Ninject的一个扩展Ninject.Extensions.Wcf

Ninject.Extensions.Wcf命名空间下提供了多种NinjectServiceHost以及他们的NinjectServiceHost<T>泛型版本。

我们在创建宿主的时候,不需要手动的去new一个ServiceHost实例。

可以直接通过kernel.Get<NinjectServiceHost<服务类型>>();的方式直接获取宿主。

并且在服务宿主创建的时候,会自动检查所有依赖关系。

示例代码:

public static class Program
{public static void Main(){IKernel kernel=new StandardKernel();kernel.Bind<IMessageProvider>().To<DefaultMessageProvider>();ServiceHost host=kernel.Get<NinjectServiceHost<MessageService>>();}
}

这样我们在创建服务宿主的时候,就会关联所有依赖了,也完美解决了之前遇到的问题。

这里再次提醒,NinjectServiceHost<T>中的T为服务类型,而非契约类型,即使在关系映射列表中添加了kenrel.Bind<契约>().To<服务>();也不行。

上边这个例子应用于自托管服务。

还有一种服务的托管形式是IIS。

寄宿于IIS中的服务,就更简单了。

只需要改变下Global父类为NinjectHttpApplication 位于Ninject.Web.Common命名空间下,提供一个全局的Kernel即可。

/// <summary>/// 这里要注意,实现NinjectHttpApplication/// </summary>public class Global : NinjectHttpApplication{protected override Ninject.IKernel CreateKernel(){//创建一个IOC容器,并且将服务管理模块与内部接口映射模块添加进去 return new StandardKernel(new ServiceModule(), new InternalModule());}}

在服务的.svc页,需要声明Factory为NinjectServiceHostFactory,代码如下

DemoService.svc

<%@ ServiceHost Language="C#" Service="NinjectSOAP.Service.Services.DemoService"Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %>

扩展阅读:

Ninject.Extensions.Wcf命名空间提供的扩展方法InRequestScope() 表示了产生的对象实例,生命周期为每次Request时创建,响应/运行完毕回收

Ninject.Modules.NinjectModule 提供了依赖关系列表的模块化管理

结语:

  这篇文章不可否认很烂,其实也没什么好写的,很多东西扩展插件已经封装好了。

但是在看老外的示例代码时出了很多莫名其妙的问题,因此自己重新写了一个DEMO,进行了整理和归纳。

同时也希望为有兴趣在WCF中使用Ninject框架的朋友提供一份资料

心理明白……说不出来……一切尽在代码中吧

附Demo下载:NinjectSOAP.rar

转载于:https://www.cnblogs.com/ShadowLoki/archive/2012/12/26/2833661.html

在WCF中使用Ninject轻量级IOC框架 之 SOAP风格服务相关推荐

  1. java轻量级IOC框架Guice

    Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于: 速度快,号称比spring快100倍. 无外部配置(如需要使用外部可以可以选用Guice的扩展包) ...

  2. .NET的轻量级IOC框架芮双随笔

    面向对象的设计的重用性一直是他的一个重要特性,为了有效定义这一特性,又引申出面向对象设计的几个原则:高内聚.低耦合.功能单一.优先使用聚合.面向接口编程等.依赖这些原则和前人的经验,又发展出形形色色的 ...

  3. 架构师之路(39)---IoC框架

    1 IoC理论的背景    我们都知道,在採用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,全部的对象通过彼此的合作,终于实现系统的业务逻辑.   图1:软件系统中耦合的对象 假设我 ...

  4. IOC框架---什么是IOC

    1 IoC理论的背景     我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.                   ...

  5. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)--初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  6. python ioc框架_IOC 实现原理

    IOC 也就是"控制反转"了,不过更流行的叫法是"依赖注入"(DI - Dependency Injection).听起来挺高深,其实实现起来并不复杂.下面就看 ...

  7. 【IOC框架】分析与理解

    1 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械 ...

  8. 教你打造 Android 中的 IOC 框架

    1.概述 首先我们来吹吹牛,什么叫IoC,控制反转(Inversion of Control,英文缩写为IoC),什么意思呢? 就是你一个类里面需要用到很多个成员变量,传统的写法,你要用这些成员变量, ...

  9. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (下)

    上一篇博客我们已经带大家简单的吹了一下IoC,实现了Activity中View的布局以及控件的注入,如果你不了解,请参考:Android 进阶 教你打造 Android 中的 IOC 框架 [View ...

最新文章

  1. C++ 函数参数传递:传值,传指针,传引用
  2. 大话设计模式之装饰模式
  3. Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream
  4. php byte转 宽字符,C++宽字符与普通字符的转换实例详解
  5. leetcode79. 单词搜索 网格地图搜索+回溯经典写法啦
  6. Spring MVC源码分析(一) 说明
  7. netstat命令查看网络信息
  8. Expression.Blend.4 Chapter 图片和视频的使用
  9. textBox的Key_Down事件
  10. matlab设计凸轮轮廓代码_数控铣床搞定曲轴、凸轮轴粗加工的奥秘、高招与绝对细节经验...
  11. 记录wuyi公积金调用过程
  12. 英特尔开源技术中心招收Linux内核高手一名
  13. NAO机器人语音识别
  14. php 数据透视表,无法打开数据透视表源文件怎么解决
  15. docker安装zookeeper,以及zk可视化界面介绍
  16. 从shape类扩展出一个正五边形类(求五边形的面积和周长)----java
  17. java提取发票里面的信息,如何从OpenERP获取发票中的销售订单字段值
  18. 如何快速高效的投放互联网广告?
  19. 入门java游戏——飞翔小鸟
  20. RTT_0.96寸OLED_IIC驱动

热门文章

  1. springMVC中获取request 对象
  2. 【POJ1328】Radar Installation(贪心,决策包容)
  3. 为什么很少人学汇编_要想精通C语言,必须先学习汇编吗
  4. shǎ崽 OrOrOrOrz
  5. 设计模式—适配器模式(思维导图)
  6. bzoj 2938: [Poi2000]病毒(AC自动机)
  7. win7下U盘安装Ubuntu16.04双系统
  8. Region proposal学习笔记
  9. pytorch中lr_scheduler的使用
  10. matlab2c使用c++实现matlab函数系列教程-cos函数