mvc web api를 사용하고 있습니다. 나는 일반적인 IRepository 및 asp.net mvc 완벽하게 작동하는 IUnitOfWork 라이브러리가 있지만 내 MVC 웹 API 프로젝트에서 내 리포지토리 개체를 null로 사용하고 결과적으로 예외로 이어질 의도가있을 때. 내 저장소 및 UnitOfWork에 오브젝트가 인스턴스화 및 매개 변수 여기MVC 웹 API에서 작업이 호출 될 때 호출 할 construtor (기본 생성자 변경)를 결정하십시오.
로 한 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)
객체가 인스턴스화 및를 호출되지 않을 것이다 생성자에서 초기화되고 있다는 것입니다. 동작이 (아무리 상관없이)이라고 할 때 매개 변수없는 생성자 만 호출되고 하나의 매개 변수를 사용하여 원하는 생성자이 호출되지 않습니다. 그래서
이 어떻게 다른 단어, 원하는 생성자 대신 기본 매개 변수가없는 생성자의 호출되는 변경할 수 있습니다 어떻게 조치가 MVC 웹 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