【转】轻量级IOC框架:Ninject

简介:

前言

前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject。通过google搜索发现它是一个开源项目,最新源代码地址是:http://github.com/enkari/ninject/tree/master

用户向导:http://ninject.codeplex.com/wikipage?title=User%20Guide&referringTitle=Home

建议新手请先看看Ninject的介绍:

  1. What Is Ninject
  2. Why Use Ninject

我节选其中关于Ninject的好处,并翻译如下:

Ninject是一个快如闪电、超轻量级的基于.Net平台的依赖注入框架。它能够帮助你把应用程序分离成一个个松耦合、高内聚的模块,然后用一种灵活的方式组装起来。通过使用Ninject配套你的软件架构,那么代码将会变得更加容易编写、重用性强、易于测试和修改。

搜索博客园尚未找到关于Ninject的使用,因此本文发布一个示例作入门级教程。

Ninject入门级示例

像以前的IOC教程那样,拿日志记录做示例应该是非常直观的。

首先编写一个日志记录的接口:

public interface ILogger
{
    void Write(string message);
}

以及FlatFileLogger, DatabaseLogger 来实现Logger的逻辑(只是为了演示Ninject的使用,所以具体逻辑是省略的,只是通过控制台告诉大家使用了那个Logger):

public class FlatFileLogger : ILogger
{
    public void Write(string message)
    {
        Console.WriteLine(String.Format("Message:{0}", message));
        Console.WriteLine("Target:FlatFile");
    }
}

public class DatabaseLogger : ILogger
{
    public void Write(string message)
    {
        Console.WriteLine(String.Format("Message:{0}", message));
        Console.WriteLine("Target:Database");
    }
}

Ninject通过NinjectModule来配置依赖注入(不知道有没有文件配置,在官方教程里没找到相关资料),这里自定义自己的Module:

internal class MyModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        Bind<ILogger>().To<FlatFileLogger>();
        Bind<ILogger>().To<DatabaseLogger>();
    }
}

具体调用方法:

private static IKernel kernel = new StandardKernel(new MyModule());
static void Main(string[] args)
{
    ILogger logger = kernel.Get<ILogger>();
    logger.Write("Bruce Say: Hello Ninject!");
    Console.WriteLine("continues..");
    Console.Read();
}

通过 kernel.Get<ILogger>() 来获取ILogger的实例,之前在MyModule里先后对ILogger 绑定了FlatFileLogger 和 DatabaseLogger,而kernel.Get<ILogger>() 这里返回第一个绑定的对象,即FlatFileLogger。

构造函数注入

这里新建一个ITester 和 IocTester, 而IocTester 依赖于ILogger:

interface ITester
{
    void Test();
}

class IocTester:ITester 
{
    private ILogger _logger;
    public IocTester(ILogger logger)
    {
        _logger = logger;
    }

    public void Test()
    {
        _logger.Write("Bruce Say: Hello Ninject!");
    }
}

下面看看Ninject是怎么配置的,很简单修改MyModule,绑定ITester:Bind<ITester>().To<IocTester>():

internal class MyModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        Bind<ILogger>().To<FlatFileLogger>();
        Bind<ITester>().To<IocTester>();
    }
}

从以上配置中,我们是看不到IocTester 和ILogger 是有依赖关系的,这就是依赖注入的好处。只是简单告诉哪个接口对应哪个类,剩下的任务就可以交给Ninject来处理了。

private static IKernel kernel = new StandardKernel(new MyModule());
static void Main(string[] args)
{
    ITester tester = kernel.Get<ITester>();
    tester.Test();
    Console.WriteLine("continues..");
    Console.Read();
}

另外Ninject 也支持属性、方法等注入,具体可以参考用户向导。

IOC的世界有句话是这样说的:Don't call me, I will call you.

相关资源

介绍Ninject 在ASP.NET MVC 的应用(英文)

How to use Ninject 2 with ASP.NET MVC

另一篇关于微软的IOC框架Unity的介绍:

IOC : Unity 配置和使用




本文转自齐师傅博客园博客,原文链接:http://www.cnblogs.com/youring2/archive/2012/05/28/2520992.html,如需转载请自行联系原作者

相关文章
|
9月前
|
XML Java 开发者
Sping基础篇----掌握Sping的控制反转/依赖注入的概念【实战案例总结】
Sping基础篇----掌握Sping的控制反转/依赖注入的概念【实战案例总结】
92 4
|
存储 Java Spring
深入解析Spring框架的核心:BeanFactory体系结构探究
深入解析Spring框架的核心:BeanFactory体系结构探究
186 0
|
7月前
|
开发框架 前端开发 JavaScript
基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转
基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转
|
9月前
|
XML Java 程序员
Spring特性之二——IOC控制反转
Spring特性之二——IOC控制反转
74 4
|
缓存 Oracle JavaScript
浅谈NestJS设计思想(分层、IOC、AOP)
浅谈NestJS设计思想(分层、IOC、AOP) nestJS用了有一定时间了,当初学习node后端选择的第一个web框架,这篇文章将对NestJS框架层面的几个重要概念进行梳理,希望能加深记忆,融汇贯通,更进一步,本文阅读需要对nestJS有一定使用经验。
469 0
|
XML 前端开发 Java
搭建简易SpringFrame-ioc框架
搭建简易SpringFrame-ioc框架
|
Java Spring 容器
【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!
在《【Spring注解驱动开发】面试官再问你BeanPostProcessor的执行流程,就把这篇文章甩给他!》一文中,我们详细的介绍了BeanPostProcessor的执行流程。那么,BeanPostProcessor在Spring底层是如何使用的?今天,我们就一起来探讨下Spring的源码,一探BeanPostProcessor在Spring底层的使用情况。
【Spring注解驱动开发】BeanPostProcessor在Spring底层是如何使用的?看完这篇我懂了!!
|
C#
【我们一起写框架】C#的AOP框架
原文:【我们一起写框架】C#的AOP框架 前言 AOP,大家都是听过的,它是一种面向切面的设计模式。 不过AOP虽然是被称为设计模式,但我们应该很少能看到AOP设计的框架。为什么呢? 因为,AOP单独设计的框架几乎是无法使用的。
929 0
|
前端开发 JavaScript 容器
|
C#
一个轻量级AOP的实现(开源)
事先声明,本项目参考AOP in C#和园内大神张逸的文章,思路神马的都不是自己的!     为了让项目的代码看起来更干净,需要一个AOP!     于是就实现了一个非常简单的,非常轻量级,有多轻量级呢?     实现的AOP叫做Earthworm(蚯蚓,为什么叫这个?因为它小,它会疏通!,项目的本意也是这样,所以就叫这个!),命名空间Earthworm下有8个代码文件,包括4个公开接口,1个公开特性,1个公开的抽象类,2个内部类。
906 0