我正在使用 mvc web api。我有一个通用的 IRepository 和 IUnitOfWork 库,它在 asp.net mvc 中完美运行,但是当我打算在我的 mvc web api 项目中使用它时,我的存储库对象变为空,因此导致异常。我的存储库和 UnitOfWork 对象正在一个构造函数中被实例化和初始化,该构造函数将一个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()
{
}
这是我的 Repository 和 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();
}
}
}
我的问题是我的 Repository(AccountRepository)
和 UnitOfWork(UnitOfWork)
对象正在一个永远不会被调用的构造函数中被实例化和初始化。当一个动作被调用时(无论如何),只有无参数的构造函数被调用,而不是我想要的带有一个参数的构造函数。
如何更改它以便调用所需的构造函数而不是默认的无参数构造函数,换句话说,如何确定在 mvc web api 中调用动作时调用哪个构造函数??
我搜索了一下,我想我可以使用 DI 来解决这个问题,我使用了 Ninject,但我不知道我应该如何以及在哪里编写代码(使用 Ninject)来更改我的Account
类的默认构造函数(控制器)并将其设置为另一个构造函数
这是我NinjectWebCommon.cs
在App_Start
文件夹中的 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();
}
提前致谢