我正在开发一个Web,我决定使用自定义的DependencyResolver。我参考了this [Dependency Injection for Web API Controllers]的文章。到目前为止,在控制器的依赖注入方面,一切都运行得很好。Owin启动类中配置的代码片段
private void RegisterIoC(HttpConfiguration config)
{
_unityContainer = new UnityContainer();
_unityContainer.RegisterType<IAccountService, AccountService>();
.........
.........
config.DependencyResolver = new UnityResolver(_unityContainer);
}
但是在时,当Api第一次启动时,会在UnityResolver's GetService方法中抛出(但捕获)一些ResolutionFailedException。以下是异常消息
"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被抛出是因为我在unity配置中没有为上面的类型提供映射。
现在是我的问题:-,如果我实现自定义unity DependencyResolver,我需要定义上述类型的映射,如果需要定义它们相应的默认实现类型,或者是否有其他方法来实现DependencyResolver。我真的很担心,即使应用程序现在运行得很好,如果不能解决上面的类型,以后可能会导致严重的问题。请帮帮。
最后一个补充:-以下类型的,当我在my web api中请求任何操作时抛出相同的ResolutionFailedException。
System.Web.Http.Dispatcher.IHttpControllerActivator
System.Web.Http.Validation.IModelValidatorCache
System.Web.Http.Controllers.IHttpActionInvoker
发布于 2015-02-17 20:26:56
我在WebApi和OWIN/Katana上使用Unity时也遇到了同样的问题。
对我来说,解决方案是使用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);
}
}
我的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);
}
}
}
发布于 2016-07-28 12:49:50
如果上面的任何解决方案仍然不适用于人们,下面是我如何解决它的。
在花了一天的时间追踪这个错误后,它被证明是某种VS缓存问题。无奈之下,我删除了所有的.suo文件并强制获取最新版本,这似乎解决了这个问题。
发布于 2017-01-26 05:10:01
这个问题很久以前就有人问过了,但我遇到了一个这里没有提到的解决方案,所以也许有人仍然对此感兴趣。
在我的例子中,这些异常已经被Unity (或其他什么)在内部捕获了,但我在Visual Studio中的异常设置使它们仍然显示出来。我只需取消选中“当显示此异常类型时中断”复选框,应用程序就会继续正常运行。
https://stackoverflow.com/questions/24114970
复制相似问题