获取参数 public 构造函数错误
Getting parameterles public constructor error
An error occurred when trying to create a controller of type
'ChatBotController'. Make sure that the controller has a
parameterless public constructor.
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.d__15.MoveNext()
当我尝试访问我的 IFeedbackRepository 时,我收到错误提示。当我在 ChatBotController.cs
中放入构造函数时,就会发生这种情况
public class ChatBotController : ApiController
{
IFeedbackRepository _feedbackRepository;
public ChatBotController(IFeedbackRepository feedbackRepository)
{
_feedbackRepository = feedbackRepository;
}
[HttpPost]
public IHttpActionResult PostQuestion([FromBody]string message) //TODO: make sure that webapi will search the message in the body of the http request
{
throw new NotImplementedException();
}
}
我同时使用 MVC 和 Api,我都在我的 Global.asax:
中解决了这两个问题
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
DependencyConfig.RegisterWebApiDependencies();
DependencyConfig.RegisterMvcDependencies();
}
这是我的 DependencyConfig.cs MVC 和 Api:
public static void RegisterWebApiDependencies()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
container.Register<IAnswerGenerator, PxlAnswerGenerator>(Lifestyle.Scoped);
container.Register<ChatBotDbContext>(Lifestyle.Scoped);
container.Register<IFeedbackRepository, FeedbackDbRepository>(Lifestyle.Scoped);
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
public static void RegisterMvcDependencies()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
container.Register<IFeedbackRepository, FeedbackDbRepository>(Lifestyle.Scoped);
container.Register<ChatBotDbContext>(Lifestyle.Scoped);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
我做错了什么?
根据 documentation of Simple-Injector 当你想为你注册的 WebApi 部分初始化解析器时你需要调用
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorWebApiDependencyResolver(container));
我没看到你打电话给 container.RegisterWebApiControllers(GlobalConfiguration.Configuration);在 RegisterWebApiDependencies() 中。这是必需的。
您可能想在此处查看与 ASP.NET Web API 和 MVC 集成的 simpleinjector 文档:
https://simpleinjector.readthedocs.io/en/latest/webapiintegration.html
此外,上面的文档在 application_start() 的开头有 container/DI 设置。如果上述更改单独不起作用,您可能想尝试将以下两行放在 application_start() 的开头:
DependencyConfig.RegisterWebApiDependencies();
DependencyConfig.RegisterMvcDependencies();
An error occurred when trying to create a controller of type 'ChatBotController'. Make sure that the controller has a parameterless public constructor.
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.d__15.MoveNext()
当我尝试访问我的 IFeedbackRepository 时,我收到错误提示。当我在 ChatBotController.cs
中放入构造函数时,就会发生这种情况public class ChatBotController : ApiController
{
IFeedbackRepository _feedbackRepository;
public ChatBotController(IFeedbackRepository feedbackRepository)
{
_feedbackRepository = feedbackRepository;
}
[HttpPost]
public IHttpActionResult PostQuestion([FromBody]string message) //TODO: make sure that webapi will search the message in the body of the http request
{
throw new NotImplementedException();
}
}
我同时使用 MVC 和 Api,我都在我的 Global.asax:
中解决了这两个问题protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
DependencyConfig.RegisterWebApiDependencies();
DependencyConfig.RegisterMvcDependencies();
}
这是我的 DependencyConfig.cs MVC 和 Api:
public static void RegisterWebApiDependencies()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
container.Register<IAnswerGenerator, PxlAnswerGenerator>(Lifestyle.Scoped);
container.Register<ChatBotDbContext>(Lifestyle.Scoped);
container.Register<IFeedbackRepository, FeedbackDbRepository>(Lifestyle.Scoped);
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
public static void RegisterMvcDependencies()
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
container.Register<IFeedbackRepository, FeedbackDbRepository>(Lifestyle.Scoped);
container.Register<ChatBotDbContext>(Lifestyle.Scoped);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
我做错了什么?
根据 documentation of Simple-Injector 当你想为你注册的 WebApi 部分初始化解析器时你需要调用
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorWebApiDependencyResolver(container));
我没看到你打电话给 container.RegisterWebApiControllers(GlobalConfiguration.Configuration);在 RegisterWebApiDependencies() 中。这是必需的。
您可能想在此处查看与 ASP.NET Web API 和 MVC 集成的 simpleinjector 文档:
https://simpleinjector.readthedocs.io/en/latest/webapiintegration.html
此外,上面的文档在 application_start() 的开头有 container/DI 设置。如果上述更改单独不起作用,您可能想尝试将以下两行放在 application_start() 的开头:
DependencyConfig.RegisterWebApiDependencies(); DependencyConfig.RegisterMvcDependencies();