2009-07-23 2 views
0

지금은 TransactionScope을 예제로 삼을 것입니다. WCF의 모든 메소드가 데이터베이스 활동을 수행하고 모든 호출을 트랜잭션으로 원한다고 가정하십시오. 당신은 당신의 모든 메소드에 using 블록을 포함시킬 수 있습니다.'using'블록이있는 서비스에서 모든 WCF 메서드를 래핑하는 더 쉬운 방법이 있습니까?

메서드 수준이 아닌 서비스에서이 작업을 수행하는 더 쉬운 방법이 있는지 궁금합니다. 예를 들어, Before/After 메서드 호출 이벤트 또는 ServiceBehavior의 내용.

이제 TransactionScope에 대해 구체적으로 알았지 만 TransactionScopeRequired 특성을 사용할 수는 있지만 존재하지 않으면 무엇을 할 것입니까?

답변

1

, 문헌 말한대로 더 순수 WCF의 해결책이 될 수없는 것으로 나타납니다.

그러나 경우에 따라 허용 될 수있는 해결책이 있습니다.

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

응용 프로그램이 ASP.NET 호환 모드에서 실행될 수 있으면 이는 WCF 서비스에 HTTP 모듈이 포함될 수 있음을 의미합니다. 이렇게하면 BeginRequest 이벤트에 연결하여 개체를 만들고 HttpContext.Current.Items에 저장할 수 있습니다. EndRequest 이벤트에서이 객체를 가져 와서 Dispose() 메소드를 호출 할 수 있습니다.

+0

작업이 단방향 조작이면이 기능이 작동하지 않습니다. –

0

클라이언트에서는 TransactionScope 또는 다른 래퍼로 단 한 번의 호출을 항상 래핑하고 싶지는 않습니다. 아마도 어느 시점에 두 개 또는 세 개 이상의 호출이 그룹화되어 있어야 할 것입니다 "범위".

클라이언트 측과 서버 측 모두에서 WCF를 상당히 확장 할 수 있습니다. 그러나 이것은 실제로 여러분의 실제 응용 프로그램에 너무 의존적 인 것으로 보이며 거의 언제나 여러분이 여기에 무엇인가 강제하려는 호출을 할 것입니다. 정말로 도움이되지 마라.

또한 WCF 확장 성은 실제로 호출이 시작될 때 시작되므로 모든 종류의 시나리오를 처리 할 수 ​​있지만 실제로는 외부 코드를 어떤 종류의 범위로 감쌀 수는 없습니다.

짧은 이야기 : 당신이하려고하는 것이 많은 의미가 있다고 생각하지 않으며 WCF만으로도 할 수 없다고 생각합니다. 거의 C# 언어 (각 메서드 호출 후에 뭔가를하기 위해 컴파일러의 속임수를 추가하고 다른 것을 추가). 추가 조사 후 마크

2

이런 종류의 문제도 Aspect Oriented Programming으로 처리 할 수 ​​있습니다. 이렇게하면 클래스의 모든/모든 메소드에 "후크 할"수있는 코드를 작성할 수 있습니다.

PostSharp은 닷넷 용 AOP 라이브러리입니다.

관련 문제