私は Web API を使用してポリシー インジェクションを実装しており、DI にはカスタム DependancyResolver を使用しています。ポリシー注入を実装するために InterfaceIntercept アプローチを使用しました。クラス(カスタム作成クラス)の場合は正常に機能していますが、ApiController の場合はポリシー インジェクションが起動されません。
APIController でポリシー インジェクションを呼び出すために、インターフェイスを作成し、コントローラーでそれを実装しました。以下のコードの共有: また、MessageHandlers でポリシーを呼び出す必要もあります。
ポリシー挿入コード:
public class LogExceptionsCallHandler : ICallHandler
{
public IMethodReturn Invoke(IMethodInvocation input,
GetNextHandlerDelegate getNext)
{
IApplicationLogger logger = new ApplicationLogger();
logger.Log(LoggingLevel.TRACE, "Entering " + input.MethodBase.DeclaringType.FullName + "." + input.MethodBase.Name);
//// Perform the operation
var methodReturn = getNext().Invoke(input, getNext);
//// Method failed, go ahead
if (methodReturn.Exception != null)
return methodReturn;
//// If the result is negative, then throw an exception
logger.Log(LoggingLevel.TRACE, "Ending " + input.MethodBase.DeclaringType.FullName + "." + input.MethodBase.Name);
return methodReturn;
}
public int Order { get; set; }
}
属性コード
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Method)]
public class LogExceptionsAttribute : HandlerAttribute
{
public LogExceptionsAttribute()
{
}
public HandleLogging HandleLogging { get; set; }
public int RetryCount { get; set; }
public override ICallHandler CreateHandler(Microsoft.Practices.Unity.IUnityContainer container)
{
return new LogExceptionsCallHandler();
}
}
インターフェース コード : このインターフェースは ApiController によって実装されています
[LogExceptions]
public interface IRequestExecutionController : IHttpController
{
[LogExceptions]
HttpResponseMessage ExecuteRequest();
}
IRequestExecutionController インターフェイスは、RequestExecutionController によって実装されています。 unity で型を登録する:
container.RegisterType<IDDNPublicAPI.PassThrough.IRequestExecutionController, RequestExecutionController>("requestexecution");
インターセプトの登録
container.Configure<Interception>().SetInterceptorFor<IDDNPublicAPI.PassThrough.IRequestExecutionController>(new InterfaceInterceptor());
依存関係を解決するための統一性があるため、Controller インスタンスの作成を処理するコントローラー ファクトリ クラスを作成しました。
public class UnityControllerFactory : IHttpControllerActivator
{
private IUnityContainer container;
private readonly IControllerFactory innerFactory;
public UnityControllerFactory(IUnityContainer container)
: this(container, new DefaultControllerFactory())
{ }
public UnityControllerFactory(IUnityContainer container, IControllerFactory innerFactory)
{`enter code here`
this.container = container;
this.innerFactory = innerFactory;
}enter code here
public IHttpController Create(HttpRequestMessa`enter code here`ge request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = (IHttpController)this.container.Resolve(controllerType, controllerDescriptor.ControllerName.ToLower());
return controller;
}
}
そして、このコントローラー ファクトリをグローバル構成ファイルに登録しました。同じプロセスが他のクラスでは機能していますが、apicontroller では機能していません。
誰でもこれについて何か提案できますか?