4

重複の可能性:
MVC3 + Ninject - 方法は?

小さな mvc 4 プロジェクトで、ninject を使用して依存性注入を実装しようとしています。

これまでのところ、APIコントローラーで動作していますが、通常のコントローラーではうまくいきません。

私はNinjectResolverを持っています:

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
    {
        private readonly IKernel _kernel;

        public NinjectDependencyResolver(IKernel kernel)
            : base(kernel)
        {
            _kernel = kernel;
        }

        public IDependencyScope BeginScope()
        {
            return new NinjectDependencyScope(_kernel.BeginBlock());
        }

        public override void Dispose()
        {
            _kernel.Dispose();
        }
    }

そして NinjectScope:

public class NinjectDependencyScope : IDependencyScope
    {
        protected IResolutionRoot ResolutionRoot;

        public NinjectDependencyScope(IResolutionRoot kernel)
        {
            ResolutionRoot = kernel;
        }

        public object GetService(Type serviceType)
        {
            var request = ResolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
            return ResolutionRoot.Resolve(request).SingleOrDefault();
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            var request = ResolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
            return ResolutionRoot.Resolve(request).ToList();
        }

        public void Dispose()
        {
            var disposable = (IDisposable)ResolutionRoot;
            if (disposable != null) disposable.Dispose();
            ResolutionRoot = null;
        }
    }

次に、Global.asax で設定します。

var kernel = new StandardKernel();
            kernel.Bind(typeof(IRepository)).To(typeof(Repository));

            GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);

次に、リポジトリを次のように API コントローラーに挿入します。

private IRepository _repository;

public TestApiController(IRepository repository)
{
    _repository = repository;
}

これは正常に機能しますが、通常のコントローラーで同じことを行うと、「このオブジェクトに対してパラメーターなしのコンストラクターが定義されていません」というエラーが発生して失敗します。

何か案は?

4

1 に答える 1

5

ASP.NET MVCは、IDependencyResolverASP.NETWebAPiとは異なる名前を使用しSytem.Web.Mvc.IDependencyResolverます。

したがって、MVCコントローラーの新しい実装が必要ですNinjectDependencyResolver(幸い、MVCとWepAPiIDependencyResolverには同じ署名を持つほぼ同じメンバーがあるため、実装は簡単です)

public class NinjectMvcDependencyResolver : NinjectDependencyScope, 
                                            System.Web.Mvc.IDependencyResolver
{
    private readonly IKernel _kernel;

    public NinjectDependencyResolver(IKernel kernel)
        : base(kernel)
    {
        _kernel = kernel;
    }
}

そして、あなたはそれをで登録することができますGlobal.asax

DependencyResolver.SetResolver(new NinjectMvcDependencyResolver(kernel));
于 2012-09-02T15:23:19.717 に答える