0

mvc web apiを使用しています。私は一般的なIRepositoryとasp.net mvcで完璧に動作するIUnitOfWorkライブラリを持っていますが、私のMVC Web APIプロジェクトで使用する予定だったとき、私のリポジトリオブジェクトはnullになり、結果的に例外につながります。私のリポジトリとUnitOfWorkのオブジェクトがインスタンス化パラメータここでMVC Web APIでアクションが呼び出されたときに呼び出されるコンストラクタを決定する(デフォルトのコンストラクタを変更する)

ように、1つのIunitOfWorkオブジェクトを取るコンストラクタの内部に初期化されている(コンストラクタコード)

private IRepository<AspNetUserAccount> AccountRepository; 
    private IRepository<Doctor> DoctorRepository; 
    private readonly IUnitOfWork UnitOfWork; 
    public AccountController(IUnitOfWork unitOfWork) 
    { 
     UnitOfWork = unitOfWork; 
     AccountRepository = unitOfWork.Repository<AspNetUserAccount>(); 
     DoctorRepository = unitOfWork.Repository<Doctor>(); 
    } 
    public AccountController() 
    { 

    } 

コードであり、ここで私のリポジトリとのUnitOfWorkの使用でありますオブジェクトはRegisterのアクションAccountのコントローラです。

[AllowAnonymous] 
[Route("Register")] 
public ResultViewModel Register([FromBody]UserBindingModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return new ResultViewModel(400, "Model Is Not Valid"); 
     } 
     using (DigiTebDBContext db = new DigiTebDBContext()) 
     { 
      using (var Transaction = db.Database.BeginTransaction()) 
      { 
       try 
       { 
        var user = new ApplicationUser() 
        { 
         UserName = model.UserName, 
         Email = model.Email 
         , 
         CreateTimeStamp = DateTime.Now, 
         LastModifiedTimeStamp = DateTime.Now 
        }; 
        IdentityResult result = UserManager.Create(user, model.Password); 

        if (!result.Succeeded) 
         throw new Exception(((string[])result.Errors)[0]); 
        UserUtility.AssignRoleToUser(user.Id, "Operator"); 
        var Account = new AspNetUserAccount 
        { 
         AccountTypeValue = AccountType.Demo, 
         CreateTimeStamp = DateTime.Now 
        , 
         CreateUserId = user.Id, 
         CurrentUserCount = 0, 
         MaxUserCount = 1, 
         IsMultiUser = false 
        , 
         ExpiryDate = DateTime.Now, 
         LastModifiedUserId = user.Id, 
         LastModifiedTimeStamp = DateTime.Now 
        }; 
        AccountRepository.Insert(Account); 
        UnitOfWork.Save(); 

        Transaction.Commit(); 
        return new ResultViewModel(200, "Registeration was successfull"); 
       } 
       catch(Exception ex) 
       { 
        Transaction.Rollback(); 
        return new ResultViewModel(400, ex.Message); 
       } 
       finally 
       { 
        UnitOfWork.Dispose(); 
       } 

      } 
     } 

私の問題は私のリポジトリ(AccountRepository)とUnitOfWorkの(UnitOfWork)オブジェクトが呼び出されることはありませんコンストラクタでをインスタンス化し、初期化されていることです。 アクションが呼び出されたとき(何であれ)パラメータのないコンストラクタのみが呼び出されていて、希望のコンストラクタではないのパラメータが1つあります。 mvc web apiでアクションが呼び出されたときに、どのコンストラクタが呼び出されているかをどのようにして判断することができますか?

私はこの問題を解決するためにDIを使用することができたと思っていましたが、Ninjectを使用しましたが、コードを書き込む方法と場所を正確にはわかりません(Ninjectを使用)私Accountクラス(コントローラ)のデフォルトコンストラクタとは別のコンストラクタここ

に設定され、事前

App_Startフォルダ内のNinjectWebCommon.csの私Ninject修正

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; 
     } 
    } 
    private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind(typeof(IRepository<AspNetUserAccount>)).To(typeof(Repository<AspNetUserAccount>)).InRequestScope(); 
     kernel.Bind(typeof(IDataContext)).To(typeof(DigiTebDBContext)).InRequestScope(); 

     kernel.Bind(typeof(IUnitOfWork)).To(typeof(UnitOfWork)).InRequestScope(); 

     kernel.Bind<HttpContext>().ToMethod(ctx => HttpContext.Current).InTransientScope(); 
    }   

感謝

+0

フレームワークのデフォルトコントローラーファクトリーは、パラメーターなしコンストラクターを使用します。ルックアップ 'DependencyResolver' – Nkosi

答えて

0

は、私は自分自身がもともとWebApiContrib.IoC.NinjectMVC 4 Web Api Controller does not have a default constructor?

最初にこのリンクからFRM Nugetインストールする必要があり、その後、CreateKernel機能NinjectWebCommon.csには次のように修正されるべき答えを見つけて、以下の

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); 

    //Note: Add the line below: 
    GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel); 

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

そうすることで、コントローラのデフォルトのパラメータのないコンストラクタにコメントするとき、DI(このケースではninject)は代替コンストラクタ(この場合は1つのパラメータを持つコンストラクタ)を認識します

関連する問題