2016-04-01 1 views
1

私はC#でMVCフレームワークを使用してアプリケーションを作成しています。 すべてのユーザを含むリポジトリ 'uitlenerRepository'を作成します。あなたは私が成功した他のリポジトリと同じ方法を試して見ることができるようにC#のNinjectバインディングは、標準MVCクラスの空のリポジトリになります。AccountController

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     try 
     { 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 
     catch 
     { 
      kernel.Dispose(); 
      throw; 
     } 
    } 

    /// <summary> 
    /// Load your modules or register your services here! 
    /// </summary> 
    /// <param name="kernel">The kernel.</param> 
    private static void RegisterServices(IKernel kernel) 
    { 

     kernel.Bind<IMateriaalRepository>().To<MateriaalRepository>().InRequestScope(); 
     kernel.Bind<IReservatieRepository>().To<ReservatieRepository>().InRequestScope(); 
     kernel.Bind<IUitlenerRepository>().To<UitlenerRepository>(); 
     kernel.Bind<UitleenAppContext>().ToSelf().InRequestScope(); 
    }   
} 

私はRegisterServicesクラスにNinjectWebCommonでNinjectを使用してリポジトリを結合しました。 他のリポジトリとの唯一の違いは、あらかじめ定義されたクラス 'AccountController'で新しいリポジトリを作成することです。そのクラスでは、簡単に新しいユーザーを追加できます。このクラスでは、空のコンストラクタを作成し、それを第3のパラメータとして追加しました。

public class AccountController : Controller 
    { 
     private ApplicationSignInManager _signInManager; 
     private ApplicationUserManager _userManager; 
     private IUitlenerRepository uitlenerRepository; 

    public AccountController() 
    { 
    } 

    public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, IUitlenerRepository uitlenerRepository) 
    { 
     UserManager = userManager; 
     SignInManager = signInManager; 
     this.uitlenerRepository = uitlenerRepository; 
    } 

新しいユーザーをリポジトリに追加することはできません。デバッグするとき、私はリポジトリの値がnullであることを知り、バインディングが正しく動作していないことを確認しました。

Picture of debugging

誰もがこの問題を解決する方法を知っていますか?

+0

コントローラには複数のコンストラクタがあります:[これは反パターンです](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=97)。 – Steven

答えて

0

AccountController() ctorが使用されているため、nullです。 Ninjectは、解決できる最も多くのパラメータを持つコンストラクタを選択します。 ApplicationUserManagerまたはApplicationSignInManagerのいずれかにバインディングが必要と思われます。 AccountController() ctor - パラメータを持たないものを削除することをお勧めします。そして、ninjectは例外をスローし、他のctorを使用できない理由を正確に伝えます。

関連する問題