Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带WebApi的Ninject仍在渲染”;确保控制器具有无参数的公共构造函数“;_C#_Asp.net Web Api_Ninject - Fatal编程技术网

C# 带WebApi的Ninject仍在渲染”;确保控制器具有无参数的公共构造函数“;

C# 带WebApi的Ninject仍在渲染”;确保控制器具有无参数的公共构造函数“;,c#,asp.net-web-api,ninject,C#,Asp.net Web Api,Ninject,我已经根据“确保控制器具有无参数公共构造函数”的消息研究了一些错误,这些答案似乎没有帮助。(见下图) 使用Ninject构建ASP.NET WEB API 2应用程序。 我希望有一个applicationController,它将从Angular服务轮询,以允许跨会话共享一些信息。为了实现这一点,我构建了一个applicationService,它被设计为作为一个单例运行,这样每个WebAPI会话都将共享相同的服务。我正在使用Ninject 3.2.0.0并已安装(使用基于的NPM) 尼尼特

我已经根据“确保控制器具有无参数公共构造函数”的消息研究了一些错误,这些答案似乎没有帮助。(见下图)

使用Ninject构建ASP.NET WEB API 2应用程序。 我希望有一个applicationController,它将从Angular服务轮询,以允许跨会话共享一些信息。为了实现这一点,我构建了一个applicationService,它被设计为作为一个单例运行,这样每个WebAPI会话都将共享相同的服务。我正在使用Ninject 3.2.0.0并已安装(使用基于的NPM)

  • 尼尼特
  • Ninject.Web.Common
  • Ninject.Web.WebApi
  • Ninject.Web.WebApi.WebHost
通过设计,它创建了NinjectWebCommon,我在其中添加了(我相信)必要的绑定。在初始请求期间,将实例化applicationService(如预期),但在调用applicationController的GET方法时,我得到:

尝试创建类型为的控制器时出错 “应用程序控制器”。确保控制器具有 无参数公共构造函数

堆栈跟踪显示:

at System.Linq.Expressions.Expression.New(Type)at System.Web.Http.Internal.TypeActivator.Create[TBase](类型 instanceType)在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceActivator(HttpRequestMessage 请求,类型controllerType,Func`1和activator)位于 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor控制器描述符,类型 控制器类型)

它正在调用DefaultHttpControllerActivator这一事实使我认为Ninject绑定是不正确的,但是可以实例化applicationService的唯一方法是Ninject

NinjectWebCommon中的绑定

(注意:一旦我有了这个工作更复杂的功能将被添加…但我需要这个工作第一…)

其他研究: (我有正确的参考资料和一份公开的简历)

(&几个类似的)
(据我所知,WebActivatorEx和NinjectWebCommon解决了这个问题)

我最近遇到了无参数构造函数的问题。 浪费时间在谷歌上搜索解决方案,这些解决方案在本地是可以的,但在部署时不起作用。我采取的步骤就是这些

已卸载Ninject的nugets* 仔细检查bin文件夹并删除所有Ninject*.dll 注释掉Ninject.Web.Common.cs文件中的所有代码,并按照我的意愿重命名它 保留服务绑定等。。因此,我可以恢复Ninject.Web.Common.cs,该文件将在恢复Ninject*nuget包后创建

然后我遵循了这个指南,但使用了最新的Ninject*nuget版本

别忘了将其添加到新创建的Ninject.Web.Common中 GlobalConfiguration.Configuration.DependencyResolver=新的NinjectDependencyResolver(内核)


在返回内核之前;在私有静态CreateKernel方法中。

请显示您的
IDependencyResolver
IHttpControllerActivator
注册。我已在NinjectWebCommon(上面)中编辑了其他材料。我相信CreateKernel()方法取代了对IDependencyResolver或IHttpControllerActivator的需要。(或者至少在我上面显示的第一个链接中提供的示例代码中没有)我认为这个NinjectWebCommon库是为MVC而构建的,而不是为Web API而构建的。我读到的内容表明了其他情况(如果我删除它,NinjectWebCommon类将不再编译…)我相信我的问题的根源在于ninject元素和版本以及各种文章和示例的组合,它们彼此不太一致,或者我正在做的事情不太一致。
    private static void RegisterServices(IKernel kernel)
   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();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<ScfProvider>().ToSelf().InSingletonScope();
            kernel.Bind<ApplicationService>().ToSelf().InSingletonScope().WithConstructorArgument(kernel.Get<ScfProvider>());
            kernel.Bind<ApplicationController>().ToSelf().InRequestScope().WithConstructorArgument(kernel.Get<ApplicationService>());
        }        
    }
    public sealed class ApplicationService
    {
        private readonly ICommand _scfUpdater;
        private Timer _timer;

        public ApplicationService(ScfProvider scfUpdater)
        {
            if (scfUpdater == null) throw new ArgumentNullException(nameof(scfUpdater));
            _scfUpdater = scfUpdater;
            _activeUsers = new Dictionary<string, string>();
            int scfInterval = int.Parse(ConfigurationManager.AppSettings["SCFUpdateInterval"]);
            _timer = new Timer(SCFTick, this, 0, scfInterval);
        }

#if DEBUG
        public ICommand SCFUpdater => _scfUpdater;
#endif



        private void SCFTick(object state)
        {
            _scfUpdater.Execute();
        }

        private readonly Dictionary<string, string> _activeUsers;
        public Dictionary<string, string> ActiveUsers => _activeUsers;

        public void UpdateUser(string userName, string status)
        {
            if (_activeUsers.ContainsKey(userName))
            {
                _activeUsers[userName] = status;
            }
            else
            {
                _activeUsers.Add(userName, status);
            }
        }
}
public class ApplicationController : ApiController


 {
        private readonly ApplicationService _applicationService;
        public ApplicationController(ApplicationService applicationService)
        {
            _applicationService = applicationService;
        }

        // GET: api/application
        public IHttpActionResult Get()
        {
            _applicationService.UpdateUser(User.Identity.Name, "online");
            return Ok(_applicationService.ActiveUsers);
        }
...
}