【转】轻量级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,如需转载请自行联系原作者

相关文章
|
运维 负载均衡 网络协议
linux网络管理(链路聚合、桥接网络、故障排查、常用工具)
网卡的链路聚合就是将多块网卡连接起来,当一块网卡损坏,网络依旧可以正常运行,可以有效的防止因为网卡损坏带来的损失,同时也可以提高网络访问速度。
1518 0
linux网络管理(链路聚合、桥接网络、故障排查、常用工具)
|
6月前
|
前端开发 数据可视化 安全
82.7K star!大气炫酷UI开源项目,超级火!
shadcn/ui 是一款基于 Radix UI 和 Tailwind CSS 构建的现代化 UI 组件库,专为追求设计品质与开发效率的开发者打造。不同于传统组件库,它提供完全可定制的组件代码模板,让开发者既能享受开箱即用的便利,又能保持对设计系统的完全掌控。
172 13
|
10月前
|
API 数据库
Abp源码分析之Abp最小系统
本文详细介绍了如何构建一个基于ABP框架的最小系统,包括创建API项目、配置模块、访问数据库等步骤。通过创建API项目、修改`Program.cs`和`BookAbpModule.cs`文件,以及添加模块和数据库访问功能,最终实现了基本的CRUD操作。文章还展示了如何使用Swagger生成API文档,并通过控制台输出验证模块的加载顺序。适合初学者快速上手ABP框架。
153 3
Abp源码分析之Abp最小系统
|
10月前
|
存储 开发框架 前端开发
Abp源码分析之虚拟文件系统Volo.Abp.VirtualFileSystem
`Volo.Abp.VirtualFileSystem` 是 ABP 框架中的一个重要组件,提供了一种抽象文件系统的方式,使应用程序可以轻松访问和管理文件资源。本文介绍了如何在 MVC 项目中使用 `Volo.Abp.VirtualFileSystem`,包括新建项目、配置模块、添加资源文件以及读取资源文件的具体步骤。通过统一的接口处理文件和目录,无论实际存储位置如何,应用程序都能更加灵活地切换不同的文件存储方式。
146 0
Abp源码分析之虚拟文件系统Volo.Abp.VirtualFileSystem
|
缓存 监控 Java
SpringBoot健康监控
SpringBoot健康监控
156 1
|
SQL 存储 分布式计算
【Hive】Hive优化有哪些?
【4月更文挑战第16天】【Hive】Hive优化有哪些?
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
存储 人工智能 索引
Python中的嵌套字典访问与操作详解
Python中的嵌套字典访问与操作详解
402 1
|
存储 缓存 Linux
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
本文介绍了Xenomai中的XDDP(Xenomai Distributed Data Protocol)通信机制,XDDP用于实时和非实时进程之间的数据交换。XDDP在Xenomai内核中涉及的数据结构和管理方式,以及创建XDDP通道后的实时端和非实时端连接过程。
572 0
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(三)--实时与非实时数据交互
|
XML C# 数据格式
WPF技术之DocumentViewer控件
WPF 的 DocumentViewer 是一个强大的控件,用于在应用程序中显示各种类型的文档,如 XPS(XML Paper Specification)、FlowDocument 和 FixedDocument 等。
2488 1