1

我並不是在尋求一個具體的實現,而是試圖找出我正在嘗試做的事情的恰當術語,所以我可以正確地研究這個話題。執行.Net DI編譯時間代理?

我有一堆接口,這些接口由控制器,存儲庫,服務和whatnot實現。在應用程序的啓動過程中,我們使用Castle.MicroKernel.Registration.Component類來註冊要用於特定接口的類。例如:

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

最近我開始對創建每個類和方法調用的審計跟蹤感興趣。有幾百個這樣的類,所以用手寫代理類是不實際的。我可以使用模板來生成代碼,但我寧願不用我們的代碼庫來炸掉它。

所以我很好奇,如果有某種即時解決方案。我知道nHibernate在覆蓋所有實體類的某個點上創建代理類。有人可以給我一些指導,告訴我如何能夠在這裏做類似的事情嗎?

喜歡的東西:

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

顯然是行不通的,因爲我只能用仿製藥來概括類型的方法,但不是方法本身。是否有一些棘手的反思方法可以用來做到這一點?

+0

你的意思是像[面向方面編程:面向方面的編程與RealProxy類](https://msdn.microsoft.com/en-us/magazine/dn574804.aspx)? – NightOwl888

+0

不知道你想做什麼,我知道你知道,但是你可以在運行時使用反射來創建代理。 NHibernate和EF做它,它使延遲加載和其他功能成爲可能。請參閱[本文](https://stackoverflow.com/a/4802281/316799)。對於審計我喜歡使用NHibernate的監聽器,它是一個非常有用的功能:) –

+1

你有沒有考慮過動態攔截? http://app-code.net/wordpress/?p=689 –

回答

1

您正在尋找Castle Windsor所謂的攔截器。這是一個aspect-oriented的方式來解決cross-cutting concerns - 審計當然是其中之一。 See documentation,或an article about the approach

面向方面的編程之前或現有的操作之後,有效地「注入」的代碼段的方法。這是通過定義一個包裝被調用的邏輯的Inteceptor來實現的,然後註冊它以在調用特定的方法/子集時運行。

如果你想將它應用到許多註冊的服務,瞭解更多關於interceptor selection mechanismsIModelInterceptorsSelector幫助那裏。

使用PostSharp,這樣的事情甚至可以在編譯時完成。這可以加速產生的應用程序,但是如果使用得當,interceptors are not slow

+0

謝謝!這是我正在尋找的信息。這些條款和文章將幫助我進一步研究。 –