.NET 프로젝트에서 PostSharp 사용

PHPz
풀어 주다: 2017-03-12 15:48:55
원래의
4984명이 탐색했습니다.

PostSharp는 .NET 개발에 적합한 Aspect 지향 프로그래밍 요소 프레임워크입니다. 이 문서에서는 주로 소개합니다. .NET 개발의 Postsharp 관련 지식과 로깅, 캐싱, 트랜잭션 처리, 예외 처리 등과 같은 몇 가지 일반적인 측면 처리 작업.

AOP(Aspect-Oriented 프로그래밍)는 함수의 보조 기능을 비즈니스 로직과 분리하는 프로그래밍 일반(프로그래밍 패러다임)입니다. 프로그램이 더 높은 모듈성 특성을 갖도록 우려를 줄였습니다. AOP는 코딩 구현 수준에서 측면 지향 소프트웨어 개발(Aspect-Oriented Software Development)의 구체적인 표현입니다.

우리는 프로그래머들이 코딩과 개발 과정에서 추구해 온 것이 디커플링이라는 것을 알고 있고, AOP 역시 디커플링을 위해 탄생했습니다. AOP 기술의 도입은 코딩을 크게 단순화하고 복사되는 코드의 양을 줄이며 로깅, 캐싱, 트랜잭션 처리, 예외 처리 및 기타 일반적으로 사용되는 처리와 같은 코드의 통합된 부분을 보다 쉽게 ​​유지할 수 있게 해줍니다.

1. AOP 프레임워크 소개

1) AOP 기술 소개

AOP 기술은 "cross-cutting"이라는 기술을 사용하여 프로파일링합니다. 캡슐화된 객체의 내부를 풀어내고, 여러 클래스에 영향을 미치는 공개 동작을 재사용 가능한 모듈로 캡슐화하고 이름을 "Aspect", 즉 관점으로 지정합니다. 간단히 말해서 소위 "측면"은 비즈니스와 관련이 없지만 비즈니스 모듈에 의해 공동으로 호출되는 논리 또는 책임을 캡슐화하여 시스템에서 코드 중복을 줄이고 결합을 줄이는 것입니다. 모듈 간, 향후 운용성 및 유지 관리성을 촉진합니다. AOP는 수평 관계를 나타냅니다. "객체"가 객체의 속성 을 캡슐화하는 속이 빈 원통형인 경우 측면 지향 프로그래밍 방법은 이 속이 빈 원통형을 잘라내는 것과 같습니다. 안에 있는 메시지. 절단된 단면은 소위 "측면"입니다. 그런 다음 놀라운 기술로 절단된 부분을 흔적도 남기지 않고 복원했습니다.

AOP는 "크로스 커팅" 기술을 사용하여 소프트웨어 시스템을 핵심 관심사와 크로스 커팅 관심사의 두 부분으로 나눕니다. 비즈니스 처리의 주요 프로세스가 핵심 관심사이고, 그것과 관련이 거의 없는 부분이 교차 관심사입니다. 교차 관심의 한 가지 특징은 핵심 관심의 여러 위치에서 발생하는 경우가 많지만 기본적으로 모든 곳에서 유사하다는 것입니다. 권한 인증, 로깅, 트랜잭션 처리 등이 있습니다. Aop의 역할은 시스템의 다양한 관심사를 분리하여 핵심 관심사와 교차 관심사를 분리하는 것입니다. Avanade의 수석 솔루션 설계자인 Adam Magee가 말했듯이 AOP의 핵심 아이디어는 " 애플리케이션 프로그램의 비즈니스 로직을 지원을 제공하는 일반 서비스 와 분리하는 것입니다. "

2) AOP 사용 시나리오

AOP는 교차 편집 문제를 캡슐화하는 데 사용되며 다음 시나리오에서 사용할 수 있습니다. :

인증권한

캐싱 캐싱

컨텍스트 전달 콘텐츠 전달

오류 handling 오류 처리

지연 로딩                                                                                                                                                                                                                                  line 🎜>성능 최적화 

성능 최적화

지속성 지속성

리소스

풀링 리소스 풀Synchronization Synchronization

Trans

action

s Transaction

3) PostSharp 프레임워크

PostSharp는 .NET 플랫폼에서 AOP를 구현하는 데 사용되는 프레임워크로 흔히 사용되는 AOP 프레임워크입니다. 공식 홈페이지는 http://www.php.cn/입니다. 현재 최신 버전은 4.X이지만 유료 AOP 소프트웨어이다.

PostSharp는 정적 위빙 방법을 사용하여 AOP를 구현합니다. 연결 지점이 매우 풍부하고 사용하기 쉬우며 일부 .NET 플랫폼의 다른 AOP 프레임워크와 비교할 때 PostSharp는 크기는 가벼워졌지만 기능성은 전혀 뒤떨어지지 않습니다.

일반적으로 PostSharp를 사용하면 다음과 같은 이점이 있습니다.

  • 크로스 커팅 문제를 별도로 분리하면 코드의 명확성과 유지 관리성이 향상됩니다.

  • 보조 기능 코드를 Aspect로 작성해 두면 작업 부하와 중복 코드가 어느 정도 줄어듭니다.

물론 PostSharp를 사용하는 데에는 몇 가지 단점이 있습니다. 주요 단점은 다음과 같습니다.

  • 디버깅의 난이도가 높아집니다.

  • AOP가 없는 코드에 비해 운영 효율성이 떨어집니다.

그러나 이러한 단점에 비해 PostSharp를 사용하면 개발 효율성이 크게 향상되고 중복 코드가 줄어들어 코드의 가독성과 유지 관리성이 향상됩니다.

또한 GitHub에는 몇 가지 오픈 소스 AOP 구성 요소가 있습니다. 예를 들어 가장 위에 있는 것은 KingAOP(http://www.php.cn/)이기 때문입니다. 생성된 객체는 아래와 같이 동적 방식을 사용하여 이를 달성합니다.


dynamic helloWorld = new HelloWorld();
helloWorld.HelloWorldCall();
로그인 후 복사

그래서 더 편리하고 PostSharp 사용 습관과 유사하다고 하지만 객체 생성 방식을 변경하므로 일반적인 클래스 객체 처리에는 적합하지 않습니다. 프로젝트. 따라서 저는 여전히 AOP 프로그래밍 개발에 PostSharp를 사용하는 것을 선호합니다.

2. PostSharp 프레임워크 사용

1) PostSharp 컴파일 환경 준비

현재 PostSharp 버전은 4.x 공식홈페이지에서 다운받아서 사용했는데 "파이프 서버 연결 오류. 자세한 내용은 이전 경고를 참조하세요." 나중에는 그냥 3.x를 사용하기도 했습니다. 버전이지만 정상적으로 사용할 수 있습니다. 아주 좋습니다. 하하.

PostSharp는 VS에 설치할 수 있는 플러그인입니다. 설치 후 아래와 같이 PostSharp 메뉴 항목이 VS의 메뉴 열에 추가됩니다.

일반 프로젝트에서 PostSharp 기능을 사용해야 하는 경우 프로젝트 속성의 [PostSharp] 옵션 페이지에서 [이 프로젝트에 PostSharp 추가]를 이용하여 추가하세요. PostSharp를 프로젝트에 사용합니다.

추가 후 아래와 같이 PostSharp 플러그인 프롬프트 대화 상자가 나타나 해당 PostSharp 패키지 및 기타 콘텐츠가 추가된다는 메시지를 표시합니다.

완료 후 프로젝트에서 PostSharp 관련 클래스를 사용할 수 있습니다.

2) PostSharp의 AOP 측면 처리 추가

각 Aspect 클래스의 이름 지정은 "XXXAttribute" 형식이어야 한다는 것이 일반적으로 동의됩니다. ". 그 중 "XXX"가 이 Aspect의 이름이다. PostSharp는 을 상속할 수 있는 다양한 내장 "Base Aspect"를 제공하며, 그 중 "OnMethodBoundaryAspect"를 상속합니다. 이 Aspect는 함수 진입 및 종료와 같은 연결 지점 메서드를 제공합니다. . 또한, PostSharp의 Aspect 내부 라이프사이클 관리와 관련된 "[Serialize]"가 Aspect에 설정되어 있어야 합니다.

로그의 Aspect 클래스 코드는 다음과 같습니다.


    [Serializable]    public class LogAttribute : OnMethodBoundaryAspect
    {        public override void OnEntry(MethodExecutionArgs args)
        {
            Console.WriteLine(Environment.NewLine);

            Console.WriteLine("Entering [ {0} ] ...", args.Method);            base.OnEntry(args);
        }        public override void OnExit(MethodExecutionArgs args)
        {
            Console.WriteLine("Leaving [ {0} ] ...", args.Method);            base.OnExit(args);
        }
    }
로그인 후 복사

예외 처리를 위한 클래스 코드는 다음과 같습니다.


    [Serializable]    public class ExceptionAttribute : OnExceptionAspect
    {        public override void OnException(MethodExecutionArgs args)
        {
            Console.WriteLine(String.Format("Exception in :[{0}] , Message:[{1}]", args.Method, args.Exception.Message));
            args.FlowBehavior = FlowBehavior.Continue;            base.OnException(args);
        }
    }
로그인 후 복사

타이밍 처리를 위한 Aspect 클래스 코드는 다음과 같습니다.


    [Serializable]
    [MulticastAttributeUsage(MulticastTargets.Method)]    public class TimingAttribute : PostSharp.Aspects.OnMethodBoundaryAspect
    {
        [NonSerialized]
        Stopwatch _StopWatch;        public override void OnEntry(PostSharp.Aspects.MethodExecutionArgs args)
        {
            _StopWatch = Stopwatch.StartNew();            base.OnEntry(args);
        }        public override void OnExit(PostSharp.Aspects.MethodExecutionArgs args)
        {
            Console.WriteLine(string.Format("[{0}] took {1}ms to execute",              new StackTrace().GetFrame(1).GetMethod().Name,
                _StopWatch.ElapsedMilliseconds));            base.OnExit(args);
        }
    }
로그인 후 복사

트랜잭션 처리를 위한 Aspect 클래스 코드는 다음과 같습니다.


    [Serializable]
    [AspectTypeDependency(AspectDependencyAction.Order, AspectDependencyPosition.After, typeof(LogAttribute))]    public class RunInTransactionAttribute : OnMethodBoundaryAspect
    {
        [NonSerialized]
        TransactionScope TransactionScope;        public override void OnEntry(MethodExecutionArgs args)
        {            this.TransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew);
        }        public override void OnSuccess(MethodExecutionArgs args)
        {            this.TransactionScope.Complete();
        }        public override void OnException(MethodExecutionArgs args)
        {
            args.FlowBehavior = FlowBehavior.Continue;
            Transaction.Current.Rollback();
            Console.WriteLine("Transaction Was Unsuccessful!");
        }        public override void OnExit(MethodExecutionArgs args)
        {            this.TransactionScope.Dispose();
        }
    }
로그인 후 복사

다음은 여러 Aspect 클래스의 Aspect 처리 코드입니다.


        [Exception]
        [Log]        static void Calc()
        {            throw new pideByZeroException("A Math Error Occured...");
        }

        [Log, Timing]        static void LongRunningCalc()
        {            //wait for 1000 miliseconds
            Thread.Sleep(1000);
        }
로그인 후 복사

위에서 보면 기존의 예외 처리와 로그 처리는 Attribute를 통해 처리되고 함수 몸체에는 특정 부분만 남는 것을 알 수 있다 비즈니스 로직 코드 작성되어 코드의 가독성이 크게 향상되어 간결하고 명확해집니다.

위 코드 함수 호출을 실행하면 출력 로그에서 구체적인 결과 내용을 볼 수 있습니다.


Entering [ Void Calc() ] ...
“System.pideByZeroException”类型的第一次机会异常在 PostSharpExample.exe 中发生
Exception in :[Void Calc()] , Message:[A Math Error Occured...]
Leaving [ Void Calc() ] ...


Entering [ Void LongRunningCalc() ] ...
Leaving [ Void LongRunningCalc() ] ...
[LongRunningCalc] took 1002ms to execute
로그인 후 복사

这样,通过声明的方式,就实现了常规日志 、异常的处理,当然实际项目上使用日志、异常处理的这些代码肯定会更加复杂一些,不过小例子已经实现了切面逻辑的分离处理了,尘归尘、土归土,一切都是那么的简洁安静了。

 

위 내용은 .NET 프로젝트에서 PostSharp 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿