确保控制器有一个无参数的公共构造函数
本文关键字:构造函数 参数 控制器 有一个 确保 | 更新日期: 2023-09-27 18:04:40
我已经研究了一些基于消息的错误"确保控制器有一个无参数的公共构造函数"和这些答案似乎没有帮助。(见底)
构建一个ASP。. NET WEB API 2应用程序使用Ninject。我想要一个applicationController,它将从Angular服务中轮询,以允许跨会话共享一些信息。为了实现这一点,我构建了一个applicationService,设计成作为一个单例运行,这样每个web api会话将共享相同的服务。我正在使用Ninject 3.2.0.0并已安装(根据这些说明使用NPM)
- Ninject
- Ninject.Web。常见的
- Ninject.Web.WebApi
- Ninject.Web.WebApi.WebHost
按照设计,创建了我添加(我相信)必要绑定的NinjectWebCommon。在初始请求期间,applicationService被实例化(如预期的那样),但是当调用applicationController的GET方法时,我得到:
创建类型为的控制器时发生错误"控制器"。确保控制器有无参数公共构造函数。
堆栈跟踪显示:
在System.Linq.Expressions.Expression。新(类型类型)在System.Web.Http.Internal.TypeActivator.Create [TBase](类型instanceType)System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator (HttpRequestMessage请求,类型controllerType, Func ' 1&激活)System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpRequestMessageHttpControllerDescriptor, TypecontrollerType)
它调用DefaultHttpControllerActivator的事实使我认为Ninject绑定是不正确的,但是applicationService可以实例化的唯一方法是由于Ninject。
NinjectWebCommon
中的绑定 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>());
}
}
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);
}
}
}
最后是applicationController:
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);
}
...
}
(注意:一旦我有这个工作更复杂的功能将被添加…但我需要这个先工作…)
其他研究:.NET Web Api 2.1中使用Ninject绑定的无参数构造函数错误(我有正确的引用和公共c'tor)
Ninject Web Api "确保控制器有一个无参数的公共构造函数"(,几个类似的)(据我所知,WebActivatorEx和NinjectWebCommon解决了这个问题)
我最近遇到了无参数构造函数的问题。浪费时间在谷歌上搜索解决方案,这些解决方案在本地是可行的,但在部署时却不起作用,我采取的步骤是:
Uninstalled nugets for Ninject.*仔细检查bin文件夹并删除所有Ninject*.dll注释掉所有的代码在Ninject.Web.Common.cs文件和重命名它,因为我想保留服务绑定等。所以我可以在Ninject* nuget包恢复后创建的Ninject.Web.Common.cs中恢复。
然后我按照这个指南,但使用最新的Ninject* nuget版本。
https://nodogmablog.bryanhogan.net/2016/04/web-api-2-and-ninject-how-to-make-them-work-together/不要忘记将其添加到新创建的Ninject.Web.CommonGlobalConfiguration.Configuration。
before return kernel;