私は 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; }