自分で作ったり提供したりするものは、まず自分自身で使ってみろろということです。自分じゃ使わないものなら人はいくらでも無責任にも無思考にもなれる。そういう投げやりな「サービス」やら「プロダクツ」なんて、だれだってイヤだ。自分が作り手と同時に利用者の立場になれば、ちゃんと使えるレベルのものを提供しようとします。

2010年8月18日水曜日

Ninject(IoC/DIコンテナ)

Don't call me, I will call you.

Ninject入門サンプル
一、ログ出力インターフェースを宣言する
  1. public interface ILogger
  2. {
  3.     void Write(string message);
  4. }
二、ログ出力2つのパターンを定義する
  1. public class FlatFileLogger : ILogger
  2. {
  3.     public void Write(string message)
  4.     {
  5.         Console.WriteLine(String.Format("Message:{0}", message));
  6.         Console.WriteLine("Target:FlatFile");
  7.     }
  8. }

  9. public class DatabaseLogger : ILogger
  10. {
  11.     public void Write(string message)
  12.     {
  13.         Console.WriteLine(String.Format("Message:{0}", message));
  14.         Console.WriteLine("Target:Database");
  15.     }
  16. }
三、NinjectModuleを通じて、DI(Dependency Injection)を実現する
  1. internal class MyModule : Ninject.Modules.NinjectModule
  2. {
  3.     public override void Load()
  4.     {
  5.         Bind<ILogger>().To<FlatFileLogger>();
  6.         Bind<ILogger>().To<DatabaseLogger>();
  7.     }
  8. }
四、利用方法
  1. private static IKernel kernel = new StandardKernel(new MyModule());
  2. static void Main(string[] args)
  3. {
  4.     ILogger logger = kernel.Get<ILogger>();
  5.     logger.Write("Bruce Say: Hello Ninject!");
  6.     Console.WriteLine("continues..");
  7.     Console.Read();
  8. }

コンストラクターインジェクション
一、テストクラスを定義する
  1. interface ITester
  2. {
  3.     void Test();
  4. }

  5. class IocTester:ITester
  6. {
  7.     private ILogger _logger;
  8.     public IocTester(ILogger logger)
  9.     {
  10.         _logger = logger;
  11.     }

  12.     public void Test()
  13.     {
  14.         _logger.Write("Bruce Say: Hello Ninject!");
  15.     }
  16. }
二、コンストラクターのパラメーターをDIで実現する
  1. internal class MyModule : Ninject.Modules.NinjectModule
  2. {
  3.     public override void Load()
  4.     {
  5.         Bind<ILogger>().To<FlatFileLogger>();
  6.         Bind<ITester>().To<IocTester>();
  7.     }
  8. }
三、利用方法
  1. private static IKernel kernel = new StandardKernel(new MyModule());
  2. static void Main(string[] args)
  3. {
  4.     ITester tester = kernel.Get<ITester>();
  5.     tester.Test();
  6.     Console.WriteLine("continues..");
  7.     Console.Read();
  8. }

0 件のコメント:

コメントを投稿

ホームページ