0

mvc web api를 사용하고 있습니다. 나는 일반적인 IRepository 및 asp.net mvc 완벽하게 작동하는 IUnitOfWork 라이브러리가 있지만 내 MVC 웹 API 프로젝트에서 내 리포지토리 개체를 null로 사용하고 결과적으로 예외로 이어질 의도가있을 때. 내 저장소 및 UnitOfWork에 오브젝트가 인스턴스화 및 매개 변수 여기MVC 웹 API에서 작업이 호출 될 때 호출 할 construtor (기본 생성자 변경)를 결정하십시오.

로 한 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) 객체가 인스턴스화 및를 호출되지 않을 것이다 생성자에서 초기화되고 있다는 것입니다. 동작이 (아무리 상관없이)이라고 할 때 매개 변수없는 생성자 만 호출되고 하나의 매개 변수를 사용하여 원하는 생성자이 호출되지 않습니다. 그래서

이 어떻게 다른 단어, 원하는 생성자 대신 기본 매개 변수가없는 생성자의 호출되는 변경할 수 있습니다 어떻게 조치가 MVC 웹 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)가 대체 생성자 (이 경우에는 매개 변수가있는 생성자) 자체를 인식합니다.