0

私は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();
    }        

前もって感謝します

4

1 に答える 1

0

このリンクMVC 4 Web Api Controller does not have a default constructor?から、自分自身が最初に答えを見つけました。

最初にWebApiContrib.IoC.Ninjectを Nuget からインストールしてからCreateKernelNinjectWebCommon.cs機能を以下のように変更する必要があります

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);

    //Note: Add the line below:
    GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);

    return kernel;
}
catch
{
    kernel.Dispose();
    throw;
}
}

そうすることで、コントローラーでデフォルトのパラメーターなしのコンストラクターをコメントすると、DI (この場合は ninject) は代替コンストラクター (この場合は 1 つのパラメーターを持つコンストラクター) 自体を認識します。

于 2016-08-02T19:52:22.330 に答える