1

私は 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 では機能していません。

誰でもこれについて何か提案できますか?

4

1 に答える 1

0

Web API コントローラーは傍受できません。ただし、フィルターを使用して同じ結果を得ることができます。

これは、フィルターを使用してコントローラーでログを記録する方法を示す良い投稿です: http://damienbod.wordpress.com/2013/09/15/aop-with-asp-net-web-api/

ロギング インターセプタを引き続き使用して、バックエンド コードをログに記録できます。

于 2014-06-18T12:40:57.990 に答える