1

저는 특정 구현을 추구하지는 않지만 제가하려고하는 것에 대한 적절한 용어를 파악하려고 노력하므로 주제를 적절히 연구 할 수 있습니다..Net DI 컴파일 시간 프록시 구현?

나는 많은 인터페이스를 가지고 있으며 이러한 인터페이스는 컨트롤러, 리포지토리, 서비스 및 기타 등등으로 구현됩니다. 응용 프로그램 시작 프로세스의 어느 곳에서 우리는 Castle.MicroKernel.Registration.Component 클래스를 사용하여 특정 인터페이스에 사용할 클래스를 등록합니다. 예를 들면 다음과 같습니다.

Component.For<IPaginationService>().ImplementedBy<PaginationService>().LifeStyle.Transient 

최근에 모든 클래스와 메소드 호출의 감사 추적을 만드는 데 관심이 생겼습니다. 이 클래스 중 몇 백 개가 있으므로 수동으로 프록시 클래스를 작성하는 것은별로 실용적이지 않습니다. 템플릿을 사용하여 코드를 생성 할 수는 있지만 모든 코드베이스를 폭파하지는 않을 것입니다.

비행 솔루션에 어떤 종류가 있는지 궁금합니다. 나는 nHibernate가 모든 엔티티 클래스를 오버레이하는 어떤 지점에서 프록시 클래스를 생성한다는 것을 알고있다. 누군가 내가 여기 비슷한 것을 할 수있는 방법에 대한 지침을 나에게 줄 수 있습니까? 같은

뭔가 : 나는 방법의 유형이 아니라 방법 자체를 일반화 제네릭을 사용하는 경우에만 할 수 있기 때문에

Component.For<IPaginationService>().ImplementedBy<ProxyFor<PaginationService>>().LifeStyle.Transient 

은 물론 그 작동하지 않습니다. 이 작업을 수행하는 데 사용할 수있는 까다로운 리플렉션 접근법이 있습니까?

+0

[Aspect-Oriented Programming : RealProxy 클래스를 사용한 Aspect-Oriented Programming] (https://msdn.microsoft.com/en-us/magazine/dn574804.aspx)과 같은 의미입니까? – NightOwl888

+0

당신이하고 싶은 것을 잘 모르겠습니다. 알고 계시 겠지만, 리플렉션을 사용하여 런타임에 프록시를 만들 수 있습니다. Hibernate와 EF는 그것을 수행하고 게으른 로딩과 다른 기능들을 가능하게한다. [this post] (https://stackoverflow.com/a/4802281/316799)를 참조하십시오. 감사를 위해 NHibernate의 Listeners를 사용하고 싶습니다. 매우 유용한 기능입니다 :) –

+1

동적 가로 채기를 고려 했습니까? http://app-code.net/wordpress/?p=689 –

답변

1

성 윈저가 인터셉터라고 부르는 것을 찾고 있습니다. cross-cutting concerns에 대처하는 방법은 aspect-oriented입니다. 감사는 확실히 그 중 하나입니다. See documentation, 또는 an article about the approach :

가로 지향 프로그래밍을 효과적으로하기 전이나 기존 수술 후 코드의 조각을 "주입"접근 방식이다. 이는 인터셉터가 호출되는 로직을 랩핑 (wrapping) 한 다음 특정 세트/서브 세트의 메소드가 호출 될 때마다 실행하도록 정의함으로써 작동합니다.

많은 등록 된 서비스에 적용하려면 interceptor selection mechanisms : IModelInterceptorsSelector에 대한 자세한 내용을 참조하십시오.

PostSharp을 사용하면 컴파일시에도 이와 같은 작업을 수행 할 수 있습니다. 결과 응용 프로그램의 속도가 빨라지지만 올바르게 사용하면 interceptors are not slow이됩니다.

+0

감사! 이것은 제가 찾고 있던 정보의 종류입니다. 이 용어와 기사는 내가 더 연구하는 데 도움이 될 것입니다. –