前言
前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:
Ninject。
Ninject下载地址:
http://www.ninject.org/download
建议新手请先看看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<FlatFileLogger>();
- logger.Write("Bruce Say: Hello Ninject!");
- Console.WriteLine("continues..");
- Console.Read();
- }
通过 kernel.Get<
FlatFileLogger>() 来获取FlatFileLogger的实例,之前在MyModule里先后对
FlatFileLogger 和
DatabaseLogger绑定了ILogger
接口。
构造函数注入
这里新建一个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.
转载于:https://blog.51cto.com/zhanyah/835559