1

私は3つのプロジェクトファイルサービスレイヤプロジェクトにIOC(ninject)コードを配置する場所はどこですか?

webui - controllers and views 
framework - service layer and repos 
tests- unit tests 

を持っているので、私はそれを参照してくださいどのように私のコントローラのみ(それは私のビジネスロジックが含まれています)私のサービス層に話をするということです。サービス層はreposと対話し、データベースデータを取得します。

私のレポは、データベースと返信のデータを話すだけです。

これでユニットテストをしたい場合、私は偽のサービス層と偽のリポジトリを持っている必要があります。

このようにして、コントローラを個別に分離してサービス層をテストすることができます。

私のサービスクラスで使用できるように、フレームワーククラスライブラリに忍耐強いコードを置くのはどこですか?

スティーブンはあなたが私はMVCの拡張子を持つグローバルaspxのこの

//セットアップninjectようなものをやるべきことを言っている

編集

//今のものをバインド

private class SportsStoreServices : NinjectModule 
     { 
      public override void Load() 
      { 

       Bind<IAdminService>().To<AdminService>(); 
       Bind<IAdminRepo>().To<AdminRepo>(); 
      } 
     } 

//コントローラ

public class AccountController : Controller 
    { 
     // 
     // GET: /Account/ 

    private IAdminService adminService; 

public AccountController(IAdminService adminService) 
     { 
    this.adminService = adminService; 
} 


     public ActionResult Login() 
     { 
      var getAllAdmins = adminService.GetAllAdmins(); 
      return View(); 
     } 

    } 

//サービス層

public class AdminService : IAdminService 
{ 

    private IAdminRepo adminRepo; 
    public AdminService(IAdminRepo adminRepo) 
    { 
     this.adminRepo = adminRepo; 
    } 

    public List<Admins> GetAllAdmins() 
    { 

     return adminRepo.GetAllAdmins(); 
    } 

} 


//Repo 
    public class AdminRepo : IAdminRepo 
    { 
     public List<Admins> GetAllAdmins() 
     { 
      // some query to get all admins 
     } 
    } 
+0

ninject.web.mvcを使用していますか? https://github.com/ninject/ninject.web.mvc – dotjoe

+0

サービス層はNinjectについて何も知らない。 – dotjoe

+0

現在のところありません。私はちょうどプロasp.net mvc 2.0で行った作者に従った。それだけでwebuiの部分で私の問題を解決することはありません。サービスレイヤではないのですか?(自分のプロジェクトフォルダとリポジトリクラスの内容は何ですか) – chobo2

答えて

5

あなたは正しく(と完全に)依存性注入パターンに従ってください、あなたのIoCコンテナを参照する必要がある唯一の場所は、あなたの場合、あなたのWebプロジェクトに(アプリケーションのルートにあります)。 MVCの場合、通常、特定のIoCフレームワークを使用して新しいコントローラを作成する方法を知っているControllerFactoryがあります。コントローラはコンストラクタインジェクションの周りに設計されるので、IoCフレームワークはすべての依存関係を自動的に注入できます。あなたは通常、プロジェクト全体を通してコンストラクタインジェクションを使用します。これにより、残りのコードを選択したIoCの実装に無知にさせることができます。

単体テストでは、通常、依存関係を手動で注入するためにコンストラクタインジェクションを使用します。これにより、単体テスト用にIoCフレームワークを設定する必要がなくなります。テストプロジェクトでIoCライブラリを使用するのは苦労します。なぜなら、テストケースごとに異なる依存関係が返されることが多く、テストフレームワークでテストを並行して実行することが多いからです。したがって、には、はテストでIoCフレームワークを使用しませんが、自分でテストするタイプのコンストラクタを呼び出します。

DIを使用した単体テストのトリックは、単体テストの保守性を維持することです。たとえば、テスト対象の型の作成をファクトリメソッドに抽出することで、これを行うことができます。これにより、コード内の1か所だけでそのようなコンストラクタを呼び出すことができます。コンストラクタが変更されると、テストコードを1か所で変更する必要があります。私は保守可能な単体テストの書き方について多くのことを本のThe Art of Unit Testingで学んだ。私はそれをお勧めすることができます。

1

DIは、オブジェクト合成が行われる場所に配置する必要があります。たとえば、WCFサービスプロジェクトでは、IInstanceProvider IN IN ASP.net Global.asaxを使用して実行できます。 原則:DIがアプリケーションの起動ポイントであることを確認してください

関連する問題