C# 无法使用Ninject将依赖项注入从Angular Service调用的ASP.NET Web API控制器
我正在与ASP.NETMVC4一起使用Ninject。我正在使用存储库,并希望进行构造函数注入,以将存储库传递给其中一个控制器 以下是实现StatTracker接口的上下文对象(EntityFramework):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
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控制器之间的问题。非常感谢。