2013-07-23 1 views
5

나는 AOP와 수년간 함께 해왔지만 솔루션에 100 % 만족하지 못했습니다. AOP와 같은 런타임 위빙을 사용하는 프레임 워크는 클래스 인터페이스를 변경할 수 없습니다. 포스트 컴파일 타임즈 Postsharp와 같은 프레임 워크 (누군가 다른 사람을 알고 있습니까?) 할 수 있습니다. 이 샘플을 체크 아웃하면 클래스에 INotifyPropertyChanged 구현이 추가됩니다. ->http://www.postsharp.net/model/inotifypropertychangedAOP 사전 컴파일 시간 짜기?

이 AOP 기능은 정말 좋은 것입니다,하지만 당신은 호스팅 어셈블리 내 새로운 인터페이스에 액세스하려면 인터페이스가 컴파일 이후에 추가되기 때문에, 당신은, 를 컴파일 할 수 없습니다 ... 곧 문제에서 실행 . "PropertyChanged is not defined"오류가 발생합니다. 그래서 클래스를 다른 어셈블리로 분리함으로써 이러한 문제를 해결할 수 있습니다. 따라서 AOP의 이점을 활용할 수 있습니다. 어셈블리의 반영된 정보를 기반으로 소스 코드를 생성하는 T4-Template을 사용하여 동일한 "포스트 컴파일 시간"문제가 발생했습니다. 좋아요, 그래서 컴파일 시간이 늦어 지기도합니다 ...

내가 찾고있는 것은 클래스의 소스 코드가 Visual Studio 사용자 정의 도구를 통해 구문 분석 된 다음 C# 코드를 생성하는 솔루션입니다. 파일, 부분 클래스. (따라서 모든 AOP 적용 클래스는 부분적이어야합니다)

"Pre-Compile-Time AOP"입니다. 이것은 분명히 가능해야하며 NRefactory를 코드 파서로 사용하여 수행 할 수 있습니다. 또한 Visual Studio는 포스트 컴파일 수정보다 훨씬 더 좋아할 것입니다.

따라서이 솔루션은 컴파일 후 직공 직종의 단점을 제거합니다. 하지만 AOP의 모든 기능을 제공하지는 않습니다. 그러나 AOP- 프레임 워크와 함께, 이것은 awsome이어야합니다.

누구나 이와 같은 프레임 워크 또는 토론을 알고 있습니까?! 당신은 어떻게 생각하십니까?

종류에 관해서는, PostSharp의 경우 토마스

답변

0

, 당신은 후 컴파일에서 확인 캐스트 연산자의 일종 인 방법 Post.Cast를 사용하여 후 컴파일시에 도입 된 인터페이스에 액세스 할 수 있습니다 -시각. 설명서는 http://doc.postsharp.net/postsharp-3.0/Content.aspx/PostSharp-3.0.chm/html/M_PostSharp_Post_Cast__2.htm을 참조하십시오.

+0

감사합니다. 이건 아키텍처에 영향을 미칩니다. 코드에 복잡성 (= 캐스트)을 추가하기 때문입니다. Anders Hejlsberg에게 "컴파일러를 여는 중"이라고 물어 본 점 중 하나입니까? 인용구 : "코드 계약 관계자는 아마도 컴파일러를 후킹 할 수있는 능력을 인정했을 것입니다.이 필요성은 대체로 무시되고 있습니다." 출처 : http://www.postsharp.net/blog/post/Anders-Hejlsberg-Dead-Body –

1

여러분과 저는 이미 SNAP을 실행 가능한 대안으로 사용하고 있기 때문에 유사한 해결책을 찾고있는 사람들을 위해 여기 토론에 대한 요약을 게시하겠다고 생각했습니다.

요약하면 SNAP은 어떤 식 으로든 코드를 변경하지 않는 런타임 AOP 프레임 워크를 제공합니다. 컴파일 후 단계는 없으며 예측 가능하고 사용하기 쉬운 런타임 인터셉터 만 있습니다.

+0

감사합니다. 두 가지 옵션, 정적 직조 및 런타임 DI는 훌륭한 도구라고 생각합니다. 그것은 건축에 미치는 영향이 적기 때문에 Personatly 나는 더 정직을 좋아한다. 물론 DI를 사용하면 자신의 측면을보다 잘 제어 할 수 있습니다. 하지만 SNAp에 congratz, 당신은 훌륭한 프로젝트를 만들었습니다 :) –

1

당신이 찾고있는 것이 pMixins입니다. 아직 베타 버전이지만 디자인 타임 직조와 같은 기능을 제공합니다. AOP 코드는 부분 코드 숨김 클래스로 생성되므로 디자인 타임에 사용할 수 있습니다.

그래서 이것이 당신이 하나 개의 파일에이 작업을 수행 할 수 있음을 의미하고, 컴파일러는 행복, 비주얼 스튜디오 행복, ReSharper에서 행복입니다 :

public interface ISomeInterface 
{ 
    void SomeMethod(); 
} 

이 인터페이스의 구현을 작성합니다

가 인터페이스를 정의 (나는 이것을 믹스 인 전화) :

:

public class SomeInterfaceImplementation : ISomeInterface 
{ 
    public void SomeMethod() 
    { 
     //implementation 
    } 
} 

이 (믹스 인을 소모합니다) 대상 파일을 정의 때문에 즉시로

class Program 
{ 
    private static void Main(string[] args) 
    { 
     //Call the mixed in method 
     new Target().SomeMethod(); 

     //Target implements ISomeInterface is code-behind 
     new Utility().DoSomeWorkOnSomeInterface(new Target()); 

     //Target has an implicit conversion operator to 
     //SomeInterfaceImplementation in code-behind 
     new Utility().DoSomeWorkOnImplementation(new Target()); 
    } 
} 

이 작동하는 이유는 : 함께 모든 작업을 볼 수 있도록 지금

public class Utility 
{ 
    public void DoSomeWorkOnSomeInterface(ISomeInterface obj) 
    { 
     obj.SomeMethod(); 
    } 

    public void DoSomeWorkOnImplementation(SomeInterfaceImplementation obj) 
    { 
     obj.SomeMethod(); 
    } 
} 

그리고 :

[pMixin(Mixin = typeof(SomeInterfaceImplementation))] 
public partial class Target { } 

의이 SomeInterfaceSomeInterfaceImplementation 작동하는 유틸리티 클래스를 만들어 보자 파일을 저장하면 pMixins 코드 생성기가 즉시 디자인 타임을 짜고 코드 숨김 파일을 업데이트합니다. TargetSomeMethod을 직접 추가하고 Target의 클래스 정의를 업데이트하여 ISomeInterface을 구현하고 변환 연산자를 만듭니다.

공개 : 저는 pMixins 개발 팀에 있습니다.

+0

BTW @ Gael-Fraiteur - PostSharp는 훌륭한 도구이며 C#에서 AOP로 바뀌 었습니다! –

+0

@Thomas Haller - 당신은 NRefactory로 할 수 있다는 당신의 제안에 정확히 맞습니다. 그것이 바로 내가 사용한 것입니다! –