3

私は DI に Spring.NET で MS WebAPI を使用しており、Sprint.NET AOP を使用してメソッドをトランザクションとしてマークしています。

「コントローラー」アクションをトランザクションとしてマークすると、次のエラーが発生します。

タイプ 'CompositionAopProxy_13695853c76b40f8b9436e27afa947f0' のオブジェクトをタイプ 'TPMarketing.PayrollConsole.Web.Rest.Controllers.OrganisationsController' にキャストできません。 [] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c_ DisplayClass13.b _c(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor .ActionExecutor.Execute(Object instance, Object[] arguments)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c_ DisplayClass5.b _4()\r\n at System.Threading.Tasks.TaskHelpers. RunSynchronously[TResult](Func`1 func,CancellationToken cancelToken)

これは、Web API コントローラーでプロキシ ベースの AOP を使用できないということですか?

(回避策があります。ActionFilterAttribute から継承して Web 層で使用するための独自の「トランザクション」属性を作成しました)

ありがとう、ジョーダン。

編集... 以下のMarijnsの提案をまだチェックする時間がないので、興味のある人のための回避策を次に示します。これは、私のアクション フィルターからのコードの本体です: (TransactionManager は Spring.NET IPlatformTransactionManager です)。私はまだサービス層で通常の Spring.NET トランザクション属性を使用していますが、これはうまく機能するはずです。

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.ReadOnly = ReadOnly;
        actionContext.Request.Properties[TRANSACTION_KEY] = TransactionManager.GetTransaction(def);
    }


    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        ITransactionStatus ts = actionExecutedContext.Request.Properties[TRANSACTION_KEY] as ITransactionStatus;
        if (ts.RollbackOnly || actionExecutedContext.Exception != null)
        {
            TransactionManager.Rollback(ts);
        }
        else
        {
            TransactionManager.Commit(ts);
        }
    }

    public bool ReadOnly { get; set; }
4

1 に答える 1