C# 无法使用Ninject将依赖项注入从Angular Service调用的ASP.NET Web API控制器

C# 无法使用Ninject将依赖项注入从Angular Service调用的ASP.NET Web API控制器,c#,asp.net-mvc,entity-framework,angularjs,ninject.web.mvc,C#,Asp.net Mvc,Entity Framework,Angularjs,Ninject.web.mvc,我正在与ASP.NETMVC4一起使用Ninject。我正在使用存储库,并希望进行构造函数注入,以将存储库传递给其中一个控制器 以下是实现StatTracker接口的上下文对象(EntityFramework): public class StatTrackerRepository : IStatTrackerRepository { private GolfStatTrackerEntities _ctx; public StatTrackerRepository(GolfS

我正在与ASP.NETMVC4一起使用Ninject。我正在使用存储库,并希望进行构造函数注入,以将存储库传递给其中一个控制器

以下是实现StatTracker接口的上下文对象(EntityFramework):

public class StatTrackerRepository : IStatTrackerRepository
{
    private GolfStatTrackerEntities _ctx;

    public StatTrackerRepository(GolfStatTrackerEntities ctx)
    {
        _ctx = ctx;
    }

    public IQueryable<Facility> GetFacilites()
    {
        return _ctx.Facilities;
    }
}
public interface IStatTrackerRepository
{ 
    IQueryable<Facility> GetFacilites();
}
页面正确加载,但一旦加载页面,它会立即使用angularjs控制器调用$http方法:

function facilityIndexController($scope, $http) {
    $scope.data = [];
    $http({ method: 'GET', url: '/api/facility' }).
        success(function(result) {
            angular.copy(result.data, $scope.data);
        }).error(function() {
            alert("Could not load facilities");
        });
}
…调用以下API控制器:

public class HomeController : Controller
{
    public IStatTrackerRepository _repo { get; set; }

    public HomeController(IStatTrackerRepository repo)
    {
        _repo = repo;
    }

    public ActionResult Index()
    {
        var facilities = _repo.GetFacilites().ToList();
        return View(facilities);
    }
}
public class FacilityController : ApiController
{
    public IStatTrackerRepository _repo { get; set; }
    public GolfStatTrackerEntities ctx { get; set; }

    //public FacilityController()
    //{
    //    _repo = new StatTrackerRepository(ctx);
    //}

    public FacilityController(IStatTrackerRepository repo)
    {
        _repo = repo;
    }

    public IEnumerable<Facility> Get()
    {
        var facilities = _repo.GetFacilites().ToList();
        return facilities;
    }
}
公共类设施控制器:ApiController
{
公共IStatTrackerRepository{get;set;}
公共GolfStatTrackerEntities ctx{get;set;}
//公共设施控制器()
//{
//_repo=新Stattracker存款(ctx);
//}
公共设施控制人(IStattracker回购)
{
_回购=回购;
}
公共IEnumerable Get()
{
var facilities=_repo.GetFacilites().ToList();
返回设施;
}
}
..由于FacilityController(IStatTrackerRepository repo)从未运行,因此落入angular$http调用的错误函数中

我曾尝试使用无参数contstructor为FacilityController()实例化StatTrackerRepository(ctx),但是,执行此操作时会出现NullReferenceException

我的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);
        //GlobalConfiguration.Configuration.DependencyResolver =
        //    new NinjectResolver(kernel);
        return kernel;
    }
    catch
    {
        kernel.Dispose();
        throw;
    }
}


private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<GolfStatTrackerEntities>().To<GolfStatTrackerEntities>().InRequestScope();
    kernel.Bind<IStatTrackerRepository>().To<StatTrackerRepository>().InRequestScope();            
}
private静态IKernel CreateKernel()
{
var kernel=新的标准内核();
尝试
{
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
注册服务(内核);
//GlobalConfiguration.Configuration.DependencyResolver=
//新的旋转变压器(内核);
返回内核;
}
抓住
{
Dispose();
投掷;
}
}
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To().InRequestScope();
kernel.Bind().To().InRequestScope();
}
我不确定这是否是Ninject的问题,或者我如何实现Ninject存在问题。注入似乎在主视图的初始负载上工作,但是,当它使用angular调用API时,与Ninject存在断开连接


请提供帮助。

我们在一个旧项目上使用了类似的配置,并意识到我们需要向MVC/WebApi应用程序添加更多的基础架构代码:

NinjectDependencyScope.cs

using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Web.Http.Dependencies;
using Ninject;
using Ninject.Syntax;

namespace YourAppNameSpace
{
    public class NinjectDependencyScope : IDependencyScope
    {
        private IResolutionRoot _resolver;

        internal NinjectDependencyScope(IResolutionRoot resolver)
        {
            Contract.Assert(resolver != null);
            _resolver = resolver;
        }

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

            _resolver = null;
        }

        public object GetService(Type serviceType)
        {
            if (_resolver == null)
            {
                throw new ObjectDisposedException("this", "This scope has already been disposed");
            }

            return _resolver.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            if (_resolver == null)
            {
                throw new ObjectDisposedException("this", "This scope has already been disposed");
            }

            return _resolver.GetAll(serviceType);
        }
    }
}
using System.Web.Http.Dependencies;
using Ninject;

namespace YourAppNameSpace
{
    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());
        }
    }
}
然后,我们将以下内容添加到NinjectWebCommon.cs文件中:

public static void RegisterNinject(HttpConfiguration configuration)
        {
            // Set Web API Resolver
            configuration.DependencyResolver = new NinjectDependencyResolver(Bootstrapper.Kernel);

        }
然后将以下内容发送到Global.asax.cs文件,应用程序启动方法:

NinjectWebCommon.RegisterNinject(GlobalConfiguration.Configuration);

您使用的Web API版本和Ninject软件包/版本是什么?Ninject 3.2。WebApi 4.0.30506.0那么您也在使用Ninject.MVC3?添加这些类的最佳位置是哪里?或者它们是否已经存在于Ninject包中?我有NinjectWebCommon.cs和Global.asax.cs,但我不熟悉以前的.cs文件。它们不存在。我们将它们添加到mvc/webapi项目中。@MTL323,您应该注意,Web API 2项目可以使用以下nuget包:并且您不必创建这些类添加Ninject.Web.webapi包解决了我与API控制器之间的问题。非常感谢。