当我尝试在我的应用程序上调用控制器API端点时,我收到此错误:
{
"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred when trying to create a controller of type 'ProviderController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Type 'mynamespace.api.controllers.ProviderController' does not have a default constructor",
"ExceptionType": "System.ArgumentException",
"StackTrace": " at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
}
}
我的配置如下,我使用的是Unity.WebAPI库:
Startup.cs
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = GlobalConfiguration.Configuration;
config.DependencyResolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer());
app.UseWebApi(WebApiConfig.Register());
app.UseCors(CorsOptions.AllowAll);
config.EnsureInitialized();
}
UnityConfig.cs:
public static class UnityConfig
{
#region Unity Container
/// <summary>
/// Load types in Unity Container
/// </summary>
private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
RegisterTypes(container);
return container;
});
/// <summary>
/// Gets the configured Unity container.
/// </summary>
public static IUnityContainer GetConfiguredContainer()
{
return container.Value;
}
#endregion
/// <summary>
/// Register the types into Unity Container.
/// </summary>
/// <param name="container"></param>
public static void RegisterTypes(UnityContainer container)
{
container.RegisterType<IProviderService, ProviderService();
}
}
ProviderController.cs:
public class ProviderController : ApiController
{
private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private readonly IProviderService providerService;
public ProviderController(IProviderService providerService)
{
providerService = providerService;
}
//Controller API Methods
}
ProviderService.cs:
public ProviderService()
{
this.serviceClient = new ServiceClientAdapter();
}
我整个上午都在阅读各种各样的线索,但我无法弄清楚我哪里出错了。如果我删除Unity并直接在控制器中实例化一个新的ProviderService,一切正常。
答案 0 :(得分:1)
我的问题是一个小小的疏忽。在Startup.cs中对UseWebApi的调用并未将HttpConfiguration配置对象作为参数,而是将其声明为自己的。这意味着WebAPI和Unity配置了不同的HTTPConfiguration对象,因此WebAPI不了解Unity。
答案 1 :(得分:0)
答案已经存在!只是为了方便或更短的代码。
您可以编写单一方法
public static void RegisterComponents()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
container.RegisterType<IProviderService, ProviderService>();
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
}
Startup.cs:
public void Configuration(IAppBuilder app)
{
ConfigureOAuth(app);
HttpConfiguration config = GlobalConfiguration.Configuration;
app.UseWebApi(config);
}
然后添加UnityConfig.RegisterComponents();进入全局文件