我已经用这种方式配置了我的统一依赖:
<register type="IFeedController" mapTo="RaF.Controllers.FeedController, Raf">
<interceptor type="VirtualMethodInterceptor"></interceptor>
<interceptionBehavior type="Microsoft.Practices.Unity.InterceptionExtension.PolicyInjectionBehavior, Microsoft.Practices.Unity.Interception" />
</register>
我已经以这种方式设置了异常管理器:
public class ApplicationExceptionManager : IApplicationExceptionManager
{
private Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager _exceptionManager;
/// <summary>
/// Gets EntLibs Exception Manager instance
/// </summary>
public ExceptionManager ExceptionManager
{
get { return _exceptionManager; }
}
public ApplicationExceptionManager()
{
var exceptionHandlingPolicies = new List<ExceptionPolicyDefinition>();
var azureExceptionPolicies = ExceptionPolicies.AzureExceptionPolicies;
var systemExceptionPolicies = ExceptionPolicies.SystemExceptionPolicies;
var webAppExceptionPolicies = ExceptionPolicies.WebAppExceptionPolicies;
exceptionHandlingPolicies.Add(new ExceptionPolicyDefinition(ExceptionPolicies.AzureExceptionPolicy, azureExceptionPolicies));
exceptionHandlingPolicies.Add(new ExceptionPolicyDefinition(ExceptionPolicies.SystemExceptionPolicy, systemExceptionPolicies));
exceptionHandlingPolicies.Add(new ExceptionPolicyDefinition(ExceptionPolicies.WebAppExceptionPolicy, webAppExceptionPolicies));
_exceptionManager = new Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager(exceptionHandlingPolicies);
}
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager IApplicationExceptionManager.ExceptionManager
{
get { return _exceptionManager; }
}
}
然后我使用:
设置异常管理器ExceptionManager manager = new ApplicationExceptionManager().ExceptionManager;
ExceptionPolicy.SetExceptionManager(manager, true);
然后允许我在我的控制器和依赖项上使用ExceptionCallHandlerAttribute
。
不幸的是,宣布的处理程序从未开火,而且我在丢失的地方迷路了。这是一个简单的ASP.NET MVC WebApi控制器项目,Unity作为依赖性解析器。
我应该检查下一步该怎么办?我错过了什么吗?
答案 0 :(得分:0)
ASP.Net MVC和WebAPI控制器不会使用接口或虚拟方法进行操作 - 因此Unity拦截器无法拦截此类操作调用。
如果您需要使用相应的动作过滤器来处理异常和其他横切关注点。您也可以将此类过滤器设置为全局过滤器。
注意:确保选择正确的过滤器 - 所有相关类看起来非常相似,并且很容易滥用WebAPI控制器的MVC属性。
答案 1 :(得分:0)
默认情况下,UnityConfig.cs未配置拦截扩展名。以下是完成的调整:
var container = new UnityContainer();
container.AddNewExtension<Interception>();
RegisterTypes(container);
return container;
需要添加新扩展程序。如果在依赖项上声明了拦截行为但是容器没有添加扩展,则Unity不会触发异常。它现在正常工作。此外,拦截在ApiController和Controller上也能正常工作,尽管使用Filters可能是合适的。