WebApi用IDependencyResolver实现时启动异常了怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

我正在开发一个WebApi,使用自定义的DependencyResolver。我指的是这个[Web API控制器的依赖注入]文章。到目前为止,在控制器依赖注入方面,一切都进行得很好。我的配置代码片段

private void RegisterIoC(HttpConfiguration config)
{
    _unityContainer = new UnityContainer();
    _unityContainer.RegisterType<IAccountService, AccountService>();
    .........
    .........
    config.DependencyResolver = new UnityResolver(_unityContainer);
}

但当时当API第一次开始的时候,我抓到了一些错误。

"Exception occurred while: while resolving. 
Exception is: InvalidOperationException - 
The current type, System.Web.Http.Hosting.IHostBufferPolicySelector, 
**is an interface and cannot be constructed. Are you missing a type mapping?**"

上边引发的异常类型如下

System.Web.Http.Hosting.IHostBufferPolicySelector
System.Web.Http.Tracing.ITraceWriter
System.Web.Http.Metadata.ModelMetadataProvider
System.Web.Http.Tracing.ITraceManager
System.Web.Http.Dispatcher.IHttpControllerSelector
System.Web.Http.Dispatcher.IAssembliesResolver
System.Web.Http.Dispatcher.IHttpControllerTypeResolver
System.Web.Http.Controllers.IHttpActionSelector
System.Web.Http.Controllers.IActionValueBinder
System.Web.Http.Validation.IBodyModelValidator
System.Net.Http.Formatting.IContentNegotiator

我知道引发这些ResolutionFailedException是因为我没有在我的统一配置中为上述类型提供映射。

现在我的问题是:如果我实现自定义的统一DependencyResolver,我需要定义上述类型的映射,如果需要定义对应的默认实现类型OR,是否有其他方法来实现DependencyResolver。我真的很担心,即使应用程序现在运行良好,如果不能解决上述毛病,可能会引起严重的问题。

提问于
用户回答回答于

如果上面的解决方案仍然不起作用,下面是我解决这个问题的方法。

在花了一天时间研究这个错误之后,结果发现这是某种VS缓存问题。出于绝望,我删除了所有的.suo文件,强制获取最新,似乎解决了问题。

用户回答回答于

我正在使用WebApi和owin/Katana的UnitationwithWebApi和owin/Katana处理同一个问题。

我的解决方案是使用Unity.WebApi Nuget包中定义的UnityDependencyResolver,而不是我自己的自定义实现

Install-Package Unity.WebAPI

请注意,包将尝试在App中添加名为UnityConfig.cs的文件。在UnityConfig.cs文件中,包将添加代码,以便根据GlobalConfiguration.Configuration.DependencyResolver

这不是我们想要的。

因此,不要使用:

GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

改为使用:

config.DependencyResolver = new UnityDependencyResolver(container);

为了完整性:

我的UnityConfig.cs

public static class UnityConfig
{
    public static void Register(HttpConfiguration config)
    {
        var container = new UnityContainer();

        // Your mappings here

        config.DependencyResolver = new UnityDependencyResolver(container);
    }
}

我的Startup.cs

[assembly: OwinStartup(typeof(UnityTest.BusinessLayer.Api.ApiStartup))]
namespace UnityTest.BusinessLayer.Api
{
    public partial class ApiStartup
    {
        public void Configuration(IAppBuilder app)
        {

            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            HttpConfiguration httpConfig = new HttpConfiguration();

            UnityConfig.Register(httpConfig);

            ConfigureAuth(app); //In App_Start ->Startup.Auth

            WebApiConfig.Register(httpConfig);

            app.UseWebApi(httpConfig);
    }
  }
}

扫码关注云+社区