2011-10-17 5 views
5

Castle Windsor와 함께 클래스에 속성을 적용하는 대신 코드를 사용하여 측면을 등록 할 수 있습니다 (Windsor에서 AOP로 메소드 차단을 사용할 때). 포스트 샤프에서도 똑같은가? 그것은 선호되는 일이지만, 애트리뷰트와는 반대로 한 곳에서 인터페이스/오브젝트와 일치하는 애스펙트를 갖는 것을 선호합니다.애트리뷰트를 사용하지 않고 포스트 샤프에서 애스펙트를 적용 할 수 있습니까?

업데이트 : 인터페이스 측면을 할당 할 수있는 경우이 있어요/객체가이에 비슷한 : 당신이 할 수 있다면

container.Register(
     Component 
     .For<IService>() 
     .ImplementedBy<Service>() 
     .Interceptors(InterceptorReference.ForType<LoggingAspect>()).Anywhere 
    ); 

, 당신은 어셈블리에 특성을 배치 할 필요가 없습니다 수있는 옵션이 있습니다 것입니다/aspect를 적용하는 클래스/메소드. 그런 다음 어느 aspect가 어떤 클래스/메소드/etc에 적용되는지를 포함하는 하나의 코드 파일/클래스를 가질 수 있습니다.

답변

3

예. 멀티 캐스팅 (http://www.sharpcrafters.com/blog/post/Day-2-Applying-Aspects-with-Multicasting-Part-1.aspx, http://www.sharpcrafters.com/blog/post/Day-3-Applying-Aspects-with-Multicasting-Part-2.aspx)을 사용하거나 aspect 제공자 (http : /www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-12-e28093-Aspect-Providers-e28093-Part-1.aspx, http://www.sharpcrafters.com/blog/post/PostSharp-Principals-Day-13-e28093-Aspect-Providers-e28093-Part-2.aspx).

예 :

using System; 
    using PostSharp.Aspects; 
    using PostSharp.Extensibility; 

    [assembly: PostSharpInterfaceTest.MyAspect(AttributeTargetTypes = "PostSharpInterfaceTest.Interface1", AttributeInheritance = MulticastInheritance.Multicast)] 

    namespace PostSharpInterfaceTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Example e = new Example(); 
      Example2 e2 = new Example2(); 
      e.DoSomething(); 
      e2.DoSomething(); 
      Console.ReadKey(); 
     } 
    } 

    class Example : Interface1 
    { 

     public void DoSomething() 
     { 
      Console.WriteLine("Doing something"); 
     } 
    } 

    class Example2 : Interface1 
    { 

     public void DoSomething() 
     { 
      Console.WriteLine("Doing something else"); 
     } 
    } 

    interface Interface1 
    { 
     void DoSomething(); 
    } 

    [Serializable] 
    class MyAspect : OnMethodBoundaryAspect 
    { 
     public override void OnEntry(MethodExecutionArgs args) 
     { 
      Console.WriteLine("Entered " + args.Method.Name); 
     } 
    } 
} 

내가하는 것이 좋습니다 당신은 유형 대신 측면 제공자를 만드는 것이 좋습니다 특정 측면을 얻을 결정하기위한 복잡한 요구 사항이있는 경우.

+0

이 기사는 여전히 클래스에 속성을 적용한 것 같습니다. Castle이 다이내믹 인젝션을 수행하는 방법을 살펴 보았습니다. http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx. PostSharp로이 작업을 수행 할 수 있는지 궁금합니다. PostSharp는 컴파일 시간으로 자신의 양상을 짜기 때문에 그렇지 않은지 이해할 수 있습니다. –

+0

달성하고자하는 목표는 무엇입니까? 귀하의 질문에 "환경 설정이 중요하지만, 애트리뷰트와 반대로 한 곳에서 인터페이스/오브젝트와 일치하는 애스펙트를 선호합니다." 그래서 나는 내가했던 해답을 주었다. 이제는 런타임에 애스펙트를 활성화 또는 비활성화하려는 것처럼 들립니다. 애스펙트를 사용하여 애스펙트를 적용하면 무엇이 중요합니까? 런타임 대 컴파일 시간에 대한 걱정이 있습니까? –

+0

질문이 업데이트되었습니다. 그게 문제가 해결되면 알려줘. –

1

LOOM.NET을 살펴보면 포스트 컴파일러와 런타임 위버가 있습니다. 나중에 하나를 사용하면 원하는 것을 정확하게 보관할 수 있습니다.

0

PostSharp XML configuration을 사용할 수 있어야합니다. XML 구성은 프로젝트 로더의 플러그인 및 프로젝트 모델의 통합입니다.

.psproj에 대한 설명은 http://www.sharpcrafters.com/blog/post/Configuring-PostSharp-Diagnostics-Toolkits.aspx에서 찾을 수 있습니다.

PostSharp 툴킷이이 XML 구성을 사용하는 방법에 대한 예제 만 보았습니다. 그러나 사용자 지정 측면에서도 동일한 방식으로 작동해야합니다.

경고 : Nuget의 PostSharp Toolkit을 설치하면 기존 psproj 파일을 덮어 쓰는 것으로 나타났습니다. 따라서 백업하는 것을 잊지 마십시오.