私はmvc Web APIを使用しています。asp.net mvc で完璧に動作する一般的な IRepository および IUnitOfWork ライブラリがありますが、mvc Web API プロジェクトで使用しようとすると、リポジトリ オブジェクトが null になり、例外が発生します。私のリポジトリと UnitOfWork オブジェクトは、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()
{
}
ここに、コントローラーRegister
の動作におけるリポジトリと UnitOfWork オブジェクトの使用法を示します。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)
オブジェクトが、決して呼び出されないコンストラクターでインスタンス化および初期化されていることです。アクションが呼び出されると(何があっても) 、パラメーターなしのコンストラクターのみが呼び出され、1つのパラメーターを持つ目的のコンストラクターは呼び出されません。
デフォルトのパラメーターなしのコンストラクターの代わりに目的のコンストラクターが呼び出されるように変更するにはどうすればよいですか? ?
私はそれについて少し検索し、DI を使用してこの問題を解決できると考えました。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();
}
前もって感謝します