.Net에서 AOP를위한 최상의 구현은 무엇입니까? [닫은]


83

C #, VB.net에는 많은 AOP 구현이 있습니다. 이것은 AOP 구현의 일부입니다.

.Net에서 AOP를위한 최상의 구현은 무엇입니까? 무엇을 사용해야합니까?


4
모든 AOP에 대한 링크를 제공하여 독자가 Google에서 약간의 시간을 절약 할 수 있도록했다면 도움이 될 것입니다. 나는이 질문을 바라고 / 답변 .NET의 다른 AOP 옵션의 좋은 요약 될 것입니다
이안 Ringrose

10
52 명이 건설적인 질문에 투표했습니다. 5 개는 건설적이지 않다고 투표했습니다. 누가 결정 했습니까? 적어도 중재자는 질문을 변경하거나 재구성해야하지만 대부분의 사람들의 의견을 고려하는 것이 좋습니다.
이전 apr

2
@Revious 완전히 동의합니다!
Legends

1
SO와 사람들이 이와 같은 질문을 OT로 반대 투표한다는 것은 놀랍습니다. 토론하고 커뮤니티를 돕는 유용한 질문과 기술은 단순히 투표를 취소하고 폐쇄되지만 과거에 갇혀있는 구식 80 년대 스타일의 사람들입니다. 그래서 세상이 바뀌 었습니다. 특정 질문에 대한 답변을 돕고 싶지만 적어도 해당 질문을 게시 할 수있는 "닫힌"태그에 링크를 제공하는 것은 완전히 이해할 수 있습니다. 그것은 많은 도움이 될 것이며 이런 종류의 어리 석음을 피할 것입니다.
픽셀

답변:


45

동적 차단이 귀하의 요구를 처리 할 수 ​​있다면 Castle Dynamic Proxy 가 선택의 해결책 이라고 생각 합니다. 이 프레임 워크는 AOP 기능을 제공하려는 다른 많은 프레임 워크에서 내부적으로 사용됩니다. 일반적으로 대부분의 기존 IoC 컨테이너는 이제 몇 가지 동적 차단 메커니즘 (Spring.NET, Castle Windsor, StructureMap 등)을 제공합니다. 이미 IoC 컨테이너로 작업하고 있다면 제안하는 것을 보는 것이 더 쉬울 수 있습니다.

동적 차단이 귀하의 요구를 해결할 수없는 경우 (밀봉 된 클래스 위빙, 비가 상 호출 차단 등) 확실히 정적 위빙을 원합니다. PostSharp 는이 도메인의 참조입니다.

두 AOP 방식을 모두 활용하는 데 사용할 수있는 Linfu 도 있습니다 .


3
런타임 AOP를 수행하려면 +1하십시오. 컴파일 후 시간 AOP를 원한다면 PostSharp에 +1
Krzysztof Kozmic

이 답변에 대한 업데이트가 있습니까? 아니면 여전히 유효합니까? 나는 특별히 Spring.Aop이 성 및 PostSharp 비교하는 방법 궁금 해서요
EVREN Kuzucuoglu

1
안타깝게도 PostSharp는 상용 제품입니다
pixel

Postsharp는 무료가 아닌 상용 제품입니다. 정적 직조에 대한 다른 조언을 부탁드립니다.
Shivam Sachan 19

@ShivamSachan 무언가가 공짜이기 때문에 좋은 것은 아닙니다. .net의 대부분의 무료 AOP는 2 ~ 5 년 전 마지막 업데이트로 종료되었지만 PostSharp는 여전히 동급 최고입니다.
Offler

15

"최고"는 주관적입니다.

먼저 필요한 기능, 아키텍처 등의 목록을 작성합니다. 그런 다음 불필요한 복잡성없이 필요한 작업을 수행하는 옵션을 찾습니다. 예를 들어, 몇몇은 인터페이스 지향적입니다. 코드가 현재 인터페이스 지향적입니까? 그렇지 않은 경우 PostSharp가 더 나은 선택 일 수 있습니다 (원래 클래스에 포함됨). 그러나 물론 PostSharp는 런타임에 구성 할 수 없습니다. 코스 용 말입니다.


다음과 같이 말한 내용을 재구성 할 수 있습니다. "최고는 주관적입니다.이 프레임 워크의 일부에 대한 찬반론 목록을 작성하겠습니다."
이전 apr

11

.NET에서 측면 지향 프로그래밍을 수행하는 가장 좋은 방법은 잘 알려진 디자인 기술을 사용하는 것입니다. 예를 들어, SOLID 원칙 을 적용 하면 교차 문제를 추가하는 데 필요한 유연성과 모듈성을 얻을 수 있습니다. 디자인 권한이있는 경우 프레임 워크없이 대부분의 교차 절단 문제를 적용 할 수도 있습니다. OOP가 AOP 수행에 적합하지 않다고 생각하는 것은 오류입니다.

다음은 몇 가지 지침입니다.

  • 구체적인 인스턴스에 의존하지 말고 추상화에 의존하십시오.
  • 동일한 클래스에서 교차 우려 사항과 비즈니스 로직을 혼합하지 마십시오.
  • 이러한 관심사를 구현하는 클래스 ( 데코레이터 ) 에서 비즈니스 논리로 클래스를 래핑하여 교차 문제를 추가 합니다.
  • 디자인에서 공통 아티팩트를 찾고 동일한 유형의 추상화를 사용하여 동등하게 모델링하십시오. 예를 들어 이것이것 좀보세요 .

적절한 추상화를 갖추었을 때 시스템에 새로운 교차 우려 사항을 추가하는 것은 새로운 데코레이터 클래스를 작성하고 올바른 구현을 감싸는 문제 일뿐입니다. 추상화가 일반적인 경우 대규모 클래스 그룹 (정확히 AOP에 대한 것임)을 단일 데코레이터로 감쌀 수 있습니다.

동적 프록시 및 코드 위빙과 같은 기술을 사용하면 잘못 설계된 애플리케이션으로 작업하기가 더 쉬워 질 수 있지만 좋은 디자인을위한 대안은 없습니다. 조만간 화상을 입을 것입니다. 그렇다고 동적 프록시 생성 및 코드 위빙을 사용해서는 안된다는 의미는 아닙니다. 그러나 적절한 응용 프로그램 디자인이 없으면 이러한 기술조차도 도움이되지 않습니다.


AOP는 다음 수준의 추상화입니다. 실제로 AOP로 이어지는 것은 상속 및 구성의 한계입니다. Entlib 예외 블록을 보셨습니까? Aspect는 try-catch-log-throw를 위해 데이터베이스에 대한 모든 단일 호출에 대해 그 망할 블록을 호출하는 것보다 훨씬 깨끗합니다.
Sleeper Smith

2
예외 블록을 사용하여 데이터베이스에 대한 모든 호출을 래핑하면 어쨌든 잘못하고있는 것입니다. 좋은 디자인으로 돌아옵니다. 항상.
스티븐

그래서 db 예외를 잡는 대신 올바른 방법은 무엇입니까?
OutOFTouch

2
@OutOFTouch : 이 SO 질문 에 대한 답변을 살펴보십시오 .
스티븐

2
@SleeperSmith : "AOP가 다음 단계의 추상화"가 무엇을 의미하는지 잘 모르겠지만, AOP를 사용하지 않고는 큰 시스템을 유지 관리 할 수 ​​없다고 생각합니다. AOP 적용을 믿습니다. 그러나 AOP는 패러다임입니다. 도구가 아닙니다. 상속 제한에 동의하지만 AOP로 이어지는 구성의 제한은 아닙니다. 코드 짜기 및 동적 프록시 도구를 사용하는 것은 적절한 디자인의 부족입니다. 데코레이터를 사용하여 교차 절단 문제를 적용합니다. 이것이 내가 선호하는 AOP 적용 방법입니다.
Steven

5

최고에 대해 잘 모르겠습니다. 많은 프레임 워크가 있고 하루 중 모든 것을 시도 할 시간이 충분하지 않습니다.

PostSharp를 사용했고 시작하기가 얼마나 쉬운 지 즐겁게 놀랐습니다.

또한 Castle Windsor 및 Spring.Net을 사용하여 AOP를 살펴 보았는데 접근 방식이 다릅니다 (런타임 대 컴파일 타임). AOP와 IoC를 혼합하는 것이 의미가있는 것 같습니다. 아직 이러한 프레임 워크 중 하나를 사용하지 않는 경우 시작하는 데 훨씬 더 많은 작업이 필요하지만 그로 인해 중단되지는 않습니다.

새 프로젝트의 경우 지금은 Castle Windsor를 사용하지만 대부분 IoC도 사용하고 싶기 때문입니다. 기존 코드베이스에 AOP를 빠르게 구현해야한다면 PostSharp를 사용합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.