mvc web apiを使用しています。私は一般的なIRepositoryとasp.net mvcで完璧に動作するIUnitOfWorkライブラリを持っていますが、私のMVC Web APIプロジェクトで使用する予定だったとき、私のリポジトリオブジェクトはnullになり、結果的に例外につながります。私のリポジトリとUnitOfWorkのオブジェクトがインスタンス化パラメータここでMVC Web APIでアクションが呼び出されたときに呼び出されるコンストラクタを決定する(デフォルトのコンストラクタを変更する)
ように、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()
{
}
コードであり、ここで私のリポジトリとの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)
オブジェクトが呼び出されることはありませんコンストラクタでをインスタンス化し、初期化されていることです。 アクションが呼び出されたとき(何であれ)パラメータのないコンストラクタのみが呼び出されていて、希望のコンストラクタではないのパラメータが1つあります。 mvc web 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();
}
感謝
フレームワークのデフォルトコントローラーファクトリーは、パラメーターなしコンストラクターを使用します。ルックアップ 'DependencyResolver' – Nkosi