0

我正在使用mvc web api。我有一个通用的IRepository和IUnitOfWork库,它在asp.net mvc中很完美,但是当我打算在我的mvc web api项目中使用它时,我的存储库对象变为null,从而导致异常。我的存储库和的UnitOfWork对象被实例化和构造函数那样的把一个IunitOfWork对象作为参数确定在MVC Web API中调用操作时调用哪个构造函数(更改默认构造函数)

这里内部初始化是代码(构造函数代码)

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 web api中调用动作时调用哪个构造函数?

我搜索了一下它,我发现我可以使用DI来解决这个问题,我使用Ninject,但我不知道如何以及在哪里我应该写我的代码(使用Ninject)来更改我Account类(控制器)的默认构造函数,并将其设置为另一个构造

这里是我在NinjectWebCommon.cs Ninject修改在App_Start文件夹

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

我找到了答案了自己原先从该链接MVC 4 Web Api Controller does not have a default constructor?

第一WebApiContrib.IoC.Ninject应安装FRM的NuGet,然后CreateKernelNinjectWebCommon.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)识别替代构造函数(在这种情况下,带有一个参数的构造函数)本身