ASP.NET Web API与ninject绑定
我刚刚安装了mvc4 rc更新,我试图build立一个运气好的API应用程序。
我正在使用ninject,但不能让我的控制器加载。 我不断收到错误
types“Api.Controllers.ConsumerController”没有默认的构造函数
我对mvc很陌生,使用注射剂,请耐心等待。
我没有做任何特别的事情,通过nuget创build的默认绑定
public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); /// <summary> /// Starts the application /// </summary> public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); bootstrapper.Initialize(CreateKernel); } /// <summary> /// Stops the application. /// </summary> public static void Stop() { bootstrapper.ShutDown(); } /// <summary> /// Creates the kernel that will manage your application. /// </summary> /// <returns>The created kernel.</returns> private static IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); RegisterServices(kernel); return kernel; } /// <summary> /// Load your modules or register your services here! /// </summary> /// <param name="kernel">The kernel.</param> private static void RegisterServices(IKernel kernel) { kernel.Bind<IConsumerRepository>().To<ConsumerRepository>(); } }
我的控制器看起来像
private readonly IConsumerRepository _repository; public ConsumerController(IConsumerRepository repository) { _repository = repository; } [HttpGet] public IQueryable<Consumer> Get(Guid id) { return _repository.Get(id).AsQueryable(); }
我需要做些什么来让api控制器与ninject一起工作?
对不起,如果这是简单的东西
我改变webcommon.cs到这个之后,我尝试了你的build议Michael
private static IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); RegisterServices(kernel); GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); return kernel; } /// <summary> /// Load your modules or register your services here! /// </summary> /// <param name="kernel">The kernel.</param> private static void RegisterServices(IKernel kernel) { kernel.Bind<IConsumerRepository>().To<ConsumerRepository>(); }
我遇到错误时
var kernel = new StandardKernel();
叫做
在'Ninject.Web.WebApi,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = c7192dc5380945e7'types'Ninject.Web.WebApi.Filter.DefaultFilterProvider'中的方法'GetFilters'没有实现。
我错过了什么?
我问过Brad Wilson ,MVC4 RC已经改变了。
GlobalConfiguration.Configuration.ServiceResolver已被移至GlobalConfiguration.Configuration.DependencyResolver
使用此实现为您的Web Api创build一个Ninject DependencyResolver: https : //gist.github.com/2417226
在NinjectWebCommon.cs中 :
// Register Dependencies RegisterServices(kernel); // Set Web API Resolver GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
这个一般的错误信息
types“Api.Controllers.ConsumerController”没有默认的构造函数
也可能发生,如果你不公开你的构造函数,或者依赖不能由IoC容器解决也许是因为缺less一个参数。
错误信息至less可以说是误导。
您可以安装NuGet包WebApiContrib.IoC.Ninject并将以下代码行添加到NinjectWebCommon.cs
GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
对于在search时search“…没有默认构造函数”的人来说,寻找一个简单的方法来debugging静默失败的configuration:
- 删除构造函数注入的对象,直到可以调用构造函数
- 对于每个先前注入的,现在未初始化的对象,使用:
ServiceLocator.Current.GetInstance<[OBJ-TYPE]>()
有问题的对象将引发ActivationException和描述性消息。 你会有一些事情要去的。
请记住删除对ServiceLocator后期修订的调用。 IE浏览器。 这不是build议使用服务定位器反模式外部debugging。
你有没有注册与frawework的容器? 我更喜欢使用autofac,下面是如何在API中使用autofac的例子。 http://alexmg.com/post/2012/03/08/Autofac-ASPNET-Web-API-%28Beta%29-Integration.aspx
另外,马克·塞曼(Mark Seeman)在Web上也有很好的一篇关于DI的文章
http://blog.ploeh.dk/2012/03/20/RobustDIWithTheASPNETWebAPI.aspx
从Ploeh:
GlobalConfiguration.Configuration.ServiceResolver.SetResolver( t => this.container.Kernel.HasComponent(t) ? this.container.Resolve(t) : null, t => this.container.ResolveAll(t).Cast<object>());
以上必须在global.asax中执行
希望这可以帮助别人…
我有同样的问题,这与我负责注册负责初始化控制器的程序集的负责人有关。 被移出web到框架项目。
使用Autofac但同样适用于其他容器。
打来电话:
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
当它在Web应用程序中时,它可以正常工作,但是当移动到框架项目中时由于正在执行的程序集不再包含控制器而抛出了上述exception。
而不得不更新到:
builder.RegisterApiControllers(Assembly.GetCallingAssembly());
看来Ninject并没有抛出一个exception,因为当你的IOC依赖没有完全正确的时候,通常会这样。 相反,它看起来像我没有注册WebAPI依赖parsing器,我当然做了。 这是我对这个问题的解决scheme,但从我发现它可能是许多不同types的安装问题。 只需重新检查依赖链中的所有内容。 希望它可以帮助别人!
控制器:
public class ContestsController : ApiController { //Ninject wouldn't inject this CTOR argument resulting in the error public ContestsController(IContestEntryService contestEntryService) {
依赖关系:
public class ContestEntryService : IContestEntryService { public ContestEntryService(IContestsContext contestsContext) {
错误的configuration:
private static void RegisterServices(IKernel kernel) { kernel.Bind<IContestsContext>() .To<ContestsContext>() .InRequestScope(); kernel.Bind(x => x.FromAssembliesMatching("MyNameSpace.*") .SelectAllClasses() .BindAllInterfaces() );
正确的configuration:
private static void RegisterServices(IKernel kernel) { kernel.Bind(x => x.FromAssembliesMatching("MyNameSpace.*") .SelectAllClasses() .BindAllInterfaces() ); kernel.ReBind<IContestsContext>() .To<ContestsContext>() .InRequestScope();
一般来说Ninject在报告这些错误方面相当不错,所以我真的被扔在这个循环上!
我知道这是一个旧的post,但我find了解决scheme,在这里分享一些链接。 希望能帮助到你。
http://weblogs.asp.net/hajan/archive/2013/03/16/quick-tip-how-to-make-ninject-work-with-asp-net-web-api.aspx?CommentPosted=true# commentmessage
如果有任何人仍然有问题,请听听由于某种原因ninject不工作我们期望与mvc 4。在您的web api中,您需要编写此代码
public DefaultController() : base() { }
这将删除有关没有默认构造函数的错误,然后当您需要从get方法中获取数据时,请编写以下代码:
public IEnumerable<YourModelGoesHere> Get() { return context.YourData; }
请记住,你将不得不在这里访问你的数据库类,例如:
DefaultConnection context = new DefaultConnection();
只需安装Ninject.MvcXXX包,其中XXX – 版本的MVC …
我也有这个错误信息,但事实certificate,我的一个接口实际上并没有被任何类实现(我忘了把它添加到类的声明)。