我正在爲我的DI使用MS WebAPI和Spring.NET,並使用Sprint.NET AOP將方法標記爲事務性。Spring.NET AOP代理和MS WebAPI控制器
當我標誌着一個「控制器」行動事務,我得到以下錯誤:
無法轉換類型「CompositionAopProxy_13695853c76b40f8b9436e27afa947f0」的對象鍵入「TPMarketing.PayrollConsole.Web.Rest.Controllers.OrganisationsController」。在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor處的lambda_method(Closure,Object,Object [])\ r \ n處,「exceptionType」:「System.InvalidCastException」,「stackTrace」 <> 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 1-4(個)\ r \ n在System.Threading.Tasks.TaskHelpers.RunSynchronously [TResult(Func`1 FUNC鍵的CancellationToken的CancellationToken)
這是否意味着你不能使用代理服務器基於Web API控制器的基於Web的AOP?
(我有一個解決辦法,我已經作出了自己的「交易」屬性,從ActionFilterAttribute繼承,只是在Web層使用)
感謝, 喬丹。所以這裏
編輯... 我還沒來得及檢查Marijns建議下面呢,是我有興趣的解決方法。這是來自我的Action Filter的代碼體:(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; }
相關:http://stackoverflow.com/questions/4280143/asp-net-mvc-controller-declarative-aop-with-spring-net/4346791#4346791 – Marijn
我還沒有嘗試過使用web api,但前一段時間我已經發布了一個[詳細回答這個](http://stackoverflow.com/a/9115510/322283),在「正常「asp.net MVC控制器。 – Marijn
好,非常感謝。 – gusgorman