Ninject 确保控制器只有在站点重启后才具有带有 Owin 和 Web 的无参数构造函数 Api

Ninject Make sure that the controller has a parameterless constructor with Owin and Web Api only after site restart

我有一个应用程序总是在第一次初始化控制器时失败。它仅在站点在 IIS 中重新启动后发生。从应用程序获得 500 后,我可以重新加载页面,之后一切正常。

无法通过 google 或 SO 找到类似的场景。

我使用了很多 nuget 包,它们是

这是做配置的class

    [assembly: OwinStartup(typeof(MyNameSpace.MyClass))]

    namespace MyNameSpace
    {
        internal class MyClass
        {
            public void Configuration(IAppBuilder app)
            {
                app.UseCors(CorsOptions.AllowAll);

                var config = new HttpConfiguration();
                config.MapHttpAttributeRoutes();

                var kernel = CreateKernel();
                app.UseNinjectMiddleware(() => kernel);
                app.UseNinjectWebApi(config);

                config.EnsureInitialized();
            }

            private IKernel CreateKernel()
            {
                var kernel = new StandardKernel();
                kernel.Settings.InjectNonPublic = true;
                kernel.Bind<IMyDependency>().To<MyDependency>().InSingletonScope();
                // bindings
                return kernel;
            }
        }
    }   

下面是堆栈跟踪的样子,如果有帮助的话

    System.InvalidOperationException: An error occurred when trying to create a controller of type 'MyController'. Make sure that the controller has a parameterless public constructor. ---> System.ArgumentException: Type 'MyController' does not have a default constructor
            at System.Linq.Expressions.Expression.New(Type type)
            at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
            at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
            --- End of inner exception stack trace ---
            at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
            at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
            at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()

什么会导致应用程序第一次失败但随后可以正常工作?任何帮助将不胜感激

编辑:控制器代码看起来像

    public class MyController : ApiController
    {
        private readonly MyDependency _dependency;

        internal PathDeviationReportingController(MyDependency dependency)
        {
            _dependency = dependency;
        }

        /// <summary>
        /// Do Something
        /// </summary>
        /// <response code="200"></response>
        [HttpGet]
        [Route("route/dosomething")]
        [SwaggerResponse(200)]
        public IHttpActionResult DoSomething()
        {
            return Ok();
        }
    }

我删除了 Ninject.Common.WebHost,这并没有改变任何东西。还是有问题。

编辑以更新绑定代码的实际外观*

好的,原来是绑定问题。我遇到过这种情况

Bind<IMyDependency>().To<MyDependency>();

并在控制器中

MyController(MyDependency dependency){}

我不确定第一次后它是如何工作的,但这是实际问题。

感谢 nozzleman 指点我