我正在使用Ninject和ASP.NET MVC 4,使用存储库并希望进行构造函数注入以将存储库传递给其中一个控制器。
这是我的上下文对象(EntityFramework),它实现了我的StatTracker接口:
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();
}
然后调用我的主页控制器:
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<Facility> Get()
{
var facilities = _repo.GetFacilites().ToList();
return facilities;
}
}
当FacilityController(IStatTrackerRepository repo)没有被调用时,它会落入angular $http调用的错误函数中。
我尝试使用一个无参构造函数来为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();
}
我不确定是Ninject出了问题还是我实现Ninject的方式有问题。在Home视图的初始加载时,注入似乎是有效的,但当它使用Angular调用API时,与Ninject之间存在断开。
请帮忙解决。