CodeZine(コードジン)

特集ページ一覧

ASP.NET MVC 3におけるDI実装のポイント

ASP.NET MVC3入門(4)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/02/07 14:00
目次

簡単なクラス間のDI実装

 IDependencyResolver実装クラスであるNinjectDIResolverと、Global.asax上で設定が完了しているので、クラス間のDI実装も簡単に実施できます。簡単なサンプルを見てみましょう。

 今まではPubsControllerとViews/Pubsに関する実装をしてきましたが、ここでIPubsRepositoryインターフェイスとPubsRepositoryクラス上に新しく機能を実装し、それをHomeControllerとViews/Home上で利用してみます(図7)。

図7 サンプルのDI実装概要図
図7 サンプルのDI実装概要図

 今回は動作の確認ということでシンプルにControllerにアクセスした時間をインターフェイス越しに別クラスに渡して、そのクラスのメッセージと合わせて文字列を表示させるということを実施してみます。実行結果は図8のとおりです。

図8 クラス間のDI実装例
図8 クラス間のDI実装例

 実装手順は以下のとおりです。

  1. インターフェイスの作成
  2. インターフェイスを実装したクラスを作成
  3. Controllerのコンストラクタ設定
  4. Global.asaxにDIコンテナを登録

 順に解説します。

インターフェイスの作成

 シンプルにメソッドを1つ定義します。

インターフェイスの実装(IPubsRepository.cs)
public interface ISendMessage
{
    string SendMessage(string message);
}

 次に、このインターフェイスを実装したクラスを作成します。

インターフェイスを実装したクラスを作成

 こちらもシンプルにISendMessageインターフェイスのメソッドのみ実装します。

インターフェイスの実装をしたクラス(PubsRepository.cs)
public class SendMessageService:ISendMessage
{
    public string SendMessage(string message)
    {
        return String.Format("現在の日時は{0}です。これはDIの実装例です。", message);
    }
}

 SendMessageメソッドは見たとおりで、パラメータとして渡される時間の文字列をプラスして文字列を返します。

 次にControllerのコンストラクタ設定です。

Controllerのコンストラクタ設定

 リポジトリパターンの時同様にコンストラクタの設定をします。

HomeControllerのコンストラクタ設定(HomeController.cs)
public class HomeController : Controller
{
    private ISendMessage _sm;

    public HomeController(ISendMessage sendmessage) 
    {
        _sm = sendmessage;
    }

    public ActionResult Index()
    {
        ViewBag.Message = "ASP.NET MVC へようこそ";

        ViewBag.SendMessage = _sm.SendMessage(System.DateTime.Now.ToString());

        return View();
    }

<中略>

}

 コンストラクタ設定の他に、View側でメッセージを表示させるためにViewBag.SendMessageに対してControllerにアクセスした時間をパラメータとして渡しています。

Global.asaxにDIコンテナを登録

 IDependencyResolverの設定は完了しているので、Global.asax上に記載しているインターフェイスとクラスを紐づける記載をします。

DIコンテナの登録(Global.asax)
protected void Application_Start()
{
    // NinjectのStandarKernelオブジェクトの作成
    IKernel _kernel = new StandardKernel();
    // IPubsRepositoryとPubsRepositoryを紐づける
    _kernel.Bind<IPubsRepository>().To<PubsRepository>();
    // ISendMessageとSendMessageServiceを紐づける
    _kernel.Bind<ISendMessage>().To<SendMessageService>();
    // DIコンテナのリゾルバを登録
    DependencyResolver.SetResolver(new NinjectDIResolver(_kernel));

<中略>
}

 ISendMessageにリクエストがある場合に都度SendMessageServiceオブジェクトをインジェクションします。

 DIにより、本来はクラス間の依存関係があるため利用が難しいはずのMVCの関心の分離をさらに一歩進めて別のMVC上でも利用できることが確認できました。また、再利用性を考慮した場合、DIは有益であることもご理解いただけたのではないでしょうか。

 クラス内にクラスのオブジェクトを持つ依存関係の発生はテストを重視するシナリオでは厄介な存在であり、DIを使用することでコードやファイルこそ複雑になりますが、テストの容易さはかなりの魅力になると言えます。

まとめ

 今回はMVC 3におけるDI実装の基本について紹介しました。NinjectやUnityを使う場合は容易にDI実装が実現できます。今回は業務でも活用されるであろうデータアクセス部分にフォーカスを当てて解説しましたが、DI実装は他にもModel/View/Controller/Propertyなどさまざまな局面で利用可能です。興味がある方は本記事を足掛かりに実際に調べてみると良いでしょう。

 なお、DIのキモはあくまでテストの容易さにあります。先にも記載したように次回はTipsを混ぜながら実際に今回作成したサンプルのテストの記述をしてみます。次回もお楽しみに。

参考文献



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:ASP.NET MVC3入門

著者プロフィール

  • WINGSプロジェクト ナオキ(ナオキ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5