我正在使用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();
}
在此先感谢
框架的默认控制器工厂使用无参数构造函数。查找'DependencyResolver' – Nkosi