使用Ninject DI为API和"定期"在MVC4控制器 [英] Using Ninject DI for both api and "regular" controllers in MVC4

查看:148
本文介绍了使用Ninject DI为API和"定期"在MVC4控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


  

可能重复:结果
   MVC3 + Ninject - 如何


在一个小的MVC 4项目,我试图用ninject实现依赖注入。

到目前为止,我有它的API控制器上工作,但我不与常规控制器运气好的话。

我有一个NinjectResolver:

 公共类NinjectDependencyResolver:NinjectDependencyScope,的IDependencyResolver
    {
        私人只读的iKernel _KERNEL;        公共NinjectDependencyResolver(内核的iKernel)
            :基地(内核)
        {
            _KERNEL =内核;
        }        公共IDependencyScope BeginScope()
        {
            返回新NinjectDependencyScope(_kernel.BeginBlock());
        }        公共覆盖无效的Dispose()
        {
            _kernel.Dispose();
        }
    }

和一个NinjectScope:

 公共类NinjectDependencyScope:IDependencyScope
    {
        保护IResolutionRoot ResolutionRoot;        公共NinjectDependencyScope(IResolutionRoot内核)
        {
            ResolutionRoot =内核;
        }        公共对象GetService的(类型的serviceType)
        {
            VAR请求= ResolutionRoot.CreateRequest(的serviceType,空,新的参数[0],真实,真实);
            返回ResolutionRoot.Resolve(要求).SingleOrDefault();
        }        公共IEnumerable的<对象> GetServices(类型的serviceType)
        {
            VAR请求= ResolutionRoot.CreateRequest(的serviceType,空,新的参数[0],真实,真实);
            返回ResolutionRoot.Resolve(要求).ToList();
        }        公共无效的Dispose()
        {
            VAR一次性=(IDisposable接口)ResolutionRoot;
            如果(一次性!= NULL)disposable.Dispose();
            ResolutionRoot = NULL;
        }
    }

然后我把它架在我的Global.asax:

  VAR内核=新StandardKernel();
            kernel.Bind(typeof运算(IRepository))至(typeof运算(库))。            GlobalConfiguration.Configuration.DependencyResolver =新NinjectDependencyResolver(内核);

然后我注入一个库到API控制器是这样的:

 私人IRepository _repository;公共TestApiController(IRepository库)
{
    _repository =库;
}

这工作正常,但在常规控制器做同样的失败,并
错误此对象定义无参数的构造函数。<​​/ P>

任何想法?


解决方案

ASP.NET MVC使用不同的的IDependencyResolver 比ASP.NET的WebAPI namelly Sytem.Web.Mvc.IDependencyResolver

所以你需要为MVC控制器(幸运的是,MVC和WepAPi 的IDependencyResolver 新的 NinjectDependencyResolver 的实施几乎有同样的成员具有相同的签名,所以很容易实现)

 公共类NinjectMvcDependencyResolver:NinjectDependencyScope,
                                            System.Web.Mvc.IDependencyResolver
{
    私人只读的iKernel _KERNEL;    公共NinjectDependencyResolver(内核的iKernel)
        :基地(内核)
    {
        _KERNEL =内核;
    }
}

然后你可以在里面注册的Global.asax

  DependencyResolver.SetResolver(新NinjectMvcDependencyResolver(内核));

Possible Duplicate:
MVC3 + Ninject - How to?

In a small mvc 4 project, I'm trying to implement dependency injection using ninject.

So far, I have it working with api controllers, but I'm not having any luck with regular controllers.

I have A 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();
        }
    }

And a 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;
        }
    }

Then I set it up in my Global.asax:

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

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

Then I inject a repository into an api controller like this:

private IRepository _repository;

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

This works fine, but doing the same in a regular controller fails with the "No parameterless constructor defined for this object" error.

Any ideas?

解决方案

ASP.NET MVC uses a different IDependencyResolver than ASP.NET WebAPi namelly Sytem.Web.Mvc.IDependencyResolver.

So you need a new NinjectDependencyResolver implementation for the MVC Controllers (luckily the MVC and WepAPi IDependencyResolver almost has the same members with the same signatures, so it's easy to implement)

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

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

And then you can register it in the Global.asax with:

DependencyResolver.SetResolver(new NinjectMvcDependencyResolver(kernel));

这篇关于使用Ninject DI为API和&QUOT;定期&QUOT;在MVC4控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆