我正在为我的 DI 使用带有 Spring.NET 的 MS WebAPI,并使用 Sprint.NET AOP 将方法标记为事务性的。
当我将“控制器”操作标记为事务性时,我收到以下错误:
无法将类型为 'CompositionAopProxy_13695853c76b40f8b9436e27afa947f0' 的对象转换为类型 'TPMarketing.PayrollConsole.Web.Rest.Controllers.OrganisationsController'。","exceptionType":"System.InvalidCastException","stackTrace":" at lambda_method(Closure , Object , Object [] )\r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c_ DisplayClass13.b _c(Object instance, Object[] methodParameters)\r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor .ActionExecutor.Execute(对象实例,Object[] 参数)\r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c_ DisplayClass5.b _4()\r\n 在 System.Threading.Tasks.TaskHelpers。 RunSynchronously[TResult](Func`1 func,CancellationToken 取消令牌)
这是否意味着您不能将基于代理的 AOP 与 Web API 控制器一起使用?
(我有一个解决方法,我已经创建了我自己的“事务”属性,该属性继承自 ActionFilterAttribute 以仅在 Web 层中使用)
谢谢,乔丹。
编辑... 我还没有时间查看下面的 Marijns 建议,所以这是我为任何感兴趣的人提供的解决方法。这是我的动作过滤器中的代码主体:(TransactionManager 是 Spring.NET IPlatformTransactionManager)。我仍在我的服务层中使用普通的 Spring.NET Transaction 属性,这应该可以很好地配合它。
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; }