无法使用Ninject将依赖项注入到从Angular Service调用的ASP.NET Web API控制器中
我正在使用Ninject和ASP.NET MVC 4.我正在使用存储库并希望进行构造函数注入以将存储库传递给其中一个控制器。
这是我的上下文对象(EntityFramework),它实现了我的StatTracker接口:
public class StatTrackerRepository : IStatTrackerRepository { private GolfStatTrackerEntities _ctx; public StatTrackerRepository(GolfStatTrackerEntities ctx) { _ctx = ctx; } public IQueryable GetFacilites() { return _ctx.Facilities; } }
这是我的Repository界面:
public interface IStatTrackerRepository { IQueryable GetFacilites(); }
然后调用我的家庭控制器:
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); } }
页面加载正确,但是,一旦页面加载,它立即使用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 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 Get() { var facilities = _repo.GetFacilites().ToList(); return facilities; } }
….它落入angular $ http调用的error函数中,因为从未运行FacilityController(IStatTrackerRepository repo)。
我已经尝试使用无参数contstructor来实现FacilityController()的StatTrackerRepository(ctx),但是,当我这样做时,我得到一个NullReferenceException。
我的Ninject配置如下:
private static IKernel CreateKernel() { var kernel = new StandardKernel(); try { kernel.Bind<Func>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind().To(); RegisterServices(kernel); //GlobalConfiguration.Configuration.DependencyResolver = // new NinjectResolver(kernel); return kernel; } catch { kernel.Dispose(); throw; } } private static void RegisterServices(IKernel kernel) { kernel.Bind().To().InRequestScope(); kernel.Bind().To().InRequestScope(); }
我不确定Ninject是否有问题,或者我是如何实现Ninject的。 注入似乎是在Home视图的初始加载上工作,但是,当它使用angular来调用API时,与Ninject断开连接。
请帮忙。
我们最终在一个旧项目上使用了类似的配置,并意识到我们需要为MVC / WebApi App添加更多基础设施代码:
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
NinjectDependencyResolver.cs
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文件,Application_Start方法:
NinjectWebCommon.RegisterNinject(GlobalConfiguration.Configuration);