【问题标题】:Using Ninject DI for both api and "regular" controllers in MVC4 [duplicate]将 Ninject DI 用于 MVC4 中的 api 和“常规”控制器 [重复]
【发布时间】:2012-08-31 09:29:12
【问题描述】:

可能重复:
MVC3 + Ninject - How to?

在一个小型 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;
}

这可以正常工作,但在常规控制器中执行相同操作会失败, “没有为此对象定义无参数构造函数”错误。

有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc-4 ninject


    【解决方案1】:

    ASP.NET MVC 使用与 ASP.NET WebAPi 不同的 IDependencyResolver,即 Sytem.Web.Mvc.IDependencyResolver

    因此,您需要为 MVC 控制器创建一个新的 NinjectDependencyResolver 实现(幸运的是,MVC 和 WepAPi IDependencyResolver 几乎具有相同的成员和相同的签名,因此很容易实现)

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

    【讨论】:

    • 1.如果这是该类的全部实现,为什么要将kernel 存储在字段中? 2.不能让基类实现两个接口吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多