2010-03-19 64 views
4

幾個月前,我發現了PostSharp,一段時間後,它很好。Spring.Net可以作爲PostSharp嗎?

但隨後法律回來,回答說他們不喜歡舊版本的許可證。然後,該部門告訴我,2.0的價格高得令人無法接受(我們需要的座位數量)......我非常失望,但並沒有灰心。我想,不能是唯一的這樣的框架。

我一直在尋找替代品,但其中大部分都是死亡,維護不當(特別是在文檔部門),學術用途,或所有上述(我在看你Aspect.Net)

然後我發現了Spring.Net,一段時間以來,它都很好。

我一直在閱讀文檔,並且繼續描繪了AOP涅su似乎是一幅完美的圖畫。我不再鎖定屬性來標記要執行代碼攔截的位置,但可以用XML配置,並且對其進行更改不需要重新編譯。大。

然後我看了看樣品,看到下面,在每一個使用場景:

// Create AOP proxy using Spring.NET IoC container. 
IApplicationContext ctx = ContextRegistry.GetContext(); 
ICommand command = (ICommand)ctx["myServiceCommand"];  
command.Execute(); 
if (command.IsUndoCapable) 
{ 
    command.UnExecute(); 
} 

爲什麼必須的代碼的前兩行存在嗎?它毀了一切。這意味着我不能簡單地向用戶提供一組方面,屬性或XML配置,通過在合適的方法/類/ etc中粘貼適當的屬性或者編輯XML中的匹配模式,可以使用它們。他們必須修改他們的程序邏輯才能使其工作!

有沒有辦法讓Spring.Net在這種情況下表現爲PostSharp? (即用戶只需要添加屬性/ XML配置,而不是編輯任何方法的內容。

另外,是否有一個值得的功能替代PostSharp?我見過這樣的問題標題如此,但沒有他們只是想替換PostSharp,他們只是想補充它的功能,我需要完全替換。

+0

簡短的回答是否定的,因爲PostSharp實際上會將您的代碼重寫爲構建後步驟。儘管如此,我會讓春季專家權衡一下。我知道如果你使用DI來實例化你的服務並且願意涉足方法攔截,你會變得非常接近。 – Aaronaught 2010-03-19 22:26:02

+0

地獄,我要重寫!我甚至可以自己做需要的事情。如果只有CCI-AST被證明是足夠好的,或者至少它的示例代碼是功能強大且足夠多樣化的> _>還有什麼可以滿足我的需求嗎? – 2010-03-19 22:30:17

+0

也許你可以更具體地瞭解你想要做什麼以及你在哪裏找到這個例子?我在Spring上沒有太多,正如我已經提到過的,但是我曾經評估過一次,並且不記得必須在類中嵌入任何'ICommand'東西來使用Advice系統。 – Aaronaught 2010-03-19 22:43:20

回答

9

簡而言之,是的,Spring.Net AOP可以按照您使用基於XML的配置描述的方式工作:您可以不必使用那些最初的兩行代碼,實際上基於代碼的配置是不鼓勵的,你可以使用基於XML的配置來配置Spring.Net AOP,這實際上是推薦的方法。有幾個步驟是:

  1. 創建您的建議:BeforeAdvice,AroundAdvice,AfterReturningAdvice和ThrowsAdvice是建議的支持的類型。 AroundAdvice使用AOPAlliance接口,其他使用Spring.AOP接口。
  2. 定義你的切入點
  3. 應用切入點和建議

示例配置(從現場配置廣義):在運行時進行

<!-- START Spring.Net AOP --> 

    <object id="beforeAdvice" type="MyBeforeAdvice, MyAOP"></object> 
    <object id="beforeAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor, Spring.Aop"> 
    <property name="Advice" ref="beforeAdvice" /> 
    </object> 

    <object id="returnsAdvice" type="MyAfterReturningAdvice, MyAOP"></object> 
    <object id="returnsAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor, Spring.Aop"> 
    <property name="Advice" ref="returnsAdvice" /> 
    </object> 

    <object id="throwsAdvice" type="MyThrowsAdvice, MyAOP"></object> 
    <object id="throwsAdvisor" type="Spring.Aop.Support.DefaultPointcutAdvisor, Spring.Aop"> 
    <property name="Advice" ref="throwsAdvice" /> 
    </object> 


    <!-- Advise objects --> 
    <object type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop"> 
    <property name="ObjectNames"> 
     <list> 
     <value>*Command</value> 
     <value>...</value> 
     </list> 
    </property> 
    <property name="InterceptorNames"> 
     <list> 
     <value>beforeAdvisor</value> 
     <value>returnsAdvisor</value> 
     <value>throwsAdvisor</value> 
     </list> 
    </property> 
    </object> 


    <!-- END Spring.Net AOP --> 

織造,是非常快和非侵入。

希望這是使用的,

安德魯

+0

博客文章簡要介紹了AOP:http://andrewlocatelliwoodcock.com/2011/05/02/brief-介紹到AOP / – Alfamale 2011-05-10 10:00:02

2

我認爲你正在尋找的lookup-method injection功能。

您已經在開始的某處加載了Spring.NET應用程序上下文。 Spring.NET基於代碼的依賴性很小。問題是,你處處需要一個(諫)服務,則顯式依賴Spring.NET與ContextRegistry.GetContext()..

您可以解決與使用查找法方法替代,例如:

創建AbstractCommandFactory:

namespace MyNamespace { 
    public abstract class AbstractCommandFactory : ICommandFactory { 
    public abstract ICommand getMyCommand(); 
    } 
} 

使用Spring.NET您可以getMyCommand返回Spring.NET對象:

<objects> 
    <object id="commandfactory" 
      type="MyNamespace.AbstractCommandFactory, MyAssembly"> 
    <lookup-method name="getMyCommand" object="commands.mycommand" /> 
    </object> 

    <object id="commands.mycommand" 
      type=MyNamespace.MyCommandImplementation, MyAssembly" /> 
</objects> 

現在,當您初始化Spring.NET應用程序上下文時,加載此命令工廠並一起傳遞引用。當你需要MyCommandImplementation的一個實例,你只要求一個從工廠實例:

public void doSomeWork() { 
    // factory is an ICommandFactory 
    // instantiated earlier using the explicit context.getObject("commandfactory") 
    ICommand myCommand = this.factory.getMyCommand(); 
    myCommand.Execute(); 
} 

現在你對Spring.NET顯式依賴是很小的:只有在你的工廠的初始加載+實例。其餘的代碼保持乾淨。

獎勵要點:您可以更輕鬆地創建ICommandFactory/ICommand模塊來單元測試您的代碼。