gpt4 book ai didi

dependency-injection - 使用 IDependencyResolver 实现的 Web Api 启动异常

转载 作者:行者123 更新时间:2023-12-03 10:02:21 25 4
gpt4 key购买 nike

我正在开发一个 Web Api,我决定使用自定义 DependencyResolver。我引用 this [Dependency Injection for Web API Controllers]文章。到目前为止,在将依赖项注入(inject) Controller 方面,一切都运行良好。我的 Owin 启动类中的配置代码片段

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

但当时 当 Api 第一次启动时 中抛出(但捕获)了一些 ResolutionFailedException UnityResolver的获取服务方法。这是异常消息
"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,我需要定义上述类型的映射,如果需要定义它们对应的默认实现类型,或者是否有一些替代方法来实现 DependencyResolver。即使应用程序现在运行良好,我也很担心,如果无法解决上述类型,以后可能会导致严重问题。 请帮忙 .

最后添加:-
对于以下类型,当我向我的 Web api 请求任何操作时,会抛出相同的 ResolutionFailedException
System.Web.Http.Dispatcher.IHttpControllerActivator
System.Web.Http.Validation.IModelValidatorCache
System.Web.Http.Controllers.IHttpActionInvoker

最佳答案

我在使用 Unity 和 WebApi 和 OWIN/Katana 时遇到了同样的问题。

我的解决方案是使用 Unity.WebApi Nuget 包中定义的 UnityDependencyResolver 而不是我自己的自定义实现(如上面的@Omar Alani)

Install-Package Unity.WebAPI

请注意,该包将尝试在 App_Start 中添加一个名为 UnityConfig.cs 的文件(我自己使用的文件名)。

在该 UnityConfig.cs 文件中,包将添加代码以根据 GlobalConfiguration.Configuration.DependencyResolver 注册容器。这不是我们想要的 OWIN。

所以不要使用:
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);
}
}

我的启动.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);
}
}
}

关于dependency-injection - 使用 IDependencyResolver 实现的 Web Api 启动异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24114970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com