2011-03-29 62 views
1

我已經使用Spring.net Dependency Injection Framwork更新了我的項目。然後我繼續整合AOP以啓用簡單的日誌記錄/跟蹤機制。我有一些問題,在我的app.config圓形dependendy,但我的工作了:Spring.net AOP似乎干擾了WPF數據綁定

<spring> 
<context> 
    <resource uri="config://spring/objects"/> 
</context> 
<objects xmlns="http://www.springframework.net"> 
    <object id="loggingAroundAdvice" type="SetupBuilder.LoggingAroundAdvice"/> 
    <object id="myServiceObjectTarget" type="SetupBuilder.SetupBuilderModelView, SetupBuilder"> 
    <!--<object name="Model" type="SetupBuilder.SetupBuilderModelView, SetupBuilder">--> 
    <constructor-arg index="0" ref="MasterData"/> 
    <property name="FileSelection" ref="FileSelection"/> 
    <property name="Persistence" ref="Persistence"/> 
    <property name="Distributor" ref="Distributor"/> 
    <property name="Document" ref="Document"/> 
    <property name="StatusWindow" ref="StatusWindow"/> 
    </object> 
    <object name="Model" type="Spring.Aop.Framework.ProxyFactoryObject"> 
    <property name="target" ref="myServiceObjectTarget"/> 
    <property name="interceptorNames"> 
     <list> 
     <value>loggingAroundAdvice</value> 
     </list> 
    </property> 
    </object> 
    <object name="MasterData" type="VMRedistMasterData.Implementation.VMRedistMasterDataImpl, VMRedistMasterData"/> 
    <object name="FileSelection" type="SetupBuilder.OpenAndSaveDialog, SetupBuilder"/> 
    <object name="Persistence" type="VMRedistDelivery.Implementation.Persistence.DeliveryPersistence, VMRedistDelivery"/> 
    <object name="Distributor" type="VMRedistDelivery.Implementation.Distribution.Distributor, VMRedistDelivery"/> 
    <object name="Document" type="Word2010ReleaseDocument.Word2010ReleaseDocument, Word2010ReleaseDocument"/> 
    <object name="StatusWindow" type="SetupBuilder.WpfStatusWindow, SetupBuilder"> 
    <constructor-arg index="0" ref="Model"/> 
    </object> 
</objects> 

我的類看起來是這樣的:

public interface ISetupBuilderModelViewDependencies 
{ 
    IVMRedistMasterData MasterData { get; set; } 
    IFileSelection FileSelection { get; set; } 
    IVMRedistPersistence Persistence { get; set; } 
    IVMRedistDistributor Distributor { get; set; } 
    IVMRedistReleaseDocument Document { get; set; } 
    IStatusWindow StatusWindow { get; set; } 
} 

public class SetupBuilderModelView : ISetupBuilderModelView, ISetupBuilderModelViewDependencies, INotifyPropertyChanged 
{ 
... 
    public string Customer 
    { 
     get { return customer; } 
     set 
     { 
      customer = value; 
      FirePropertyChanged("Customer"); 
     } 
    } 
... 
} 

這裏是分配模型對象我的主要WPF窗口:

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     var context = ContextRegistry.GetContext(); 

     var setupBuilderWindow = new SetupBuilderWindow(context.GetObject("Model") as ISetupBuilderModelView); 
     // SetupBuilderWindow needs an ISetupBuilderModelView argument.        
     setupBuilderWindow.Show(); 
    } 
} 

但是,如果更改「模型」對象發生,我的WPF窗口不再更新!物業改變了。 PropertyChanged事件被拋出,有人已訂閱它。但是沒有人試圖獲得屬性值。跟蹤/日誌記錄機制起作用,get_Customer()僅在啓動時調用一次,然後再次不會。我不明白。 Spring.Aop.Framework.ProxyFactoryObject應該將每個事件從目標對象轉移給所有用戶,不是嗎?如果這不是問題並且事件到達,那麼財產中的問題是什麼? Proxy對象是否緩存目標的屬性?我只是不明白。

app.config中的註釋行沒有AOP。如果我對上面的行註釋並取消註釋,則一切正常。

如果您有任何想法,請讓我知道。我希望我提供了足夠但不是太多的信息。如果您需要更多信息,我會很樂意提供。

+0

將myServiceObjectTarget對象移動到Model對象中不起作用。以編程方式調用工廠不起作用。 – dutop 2011-03-29 07:30:40

+0

工廠創建的對象似乎不像我想的那樣與普通對象相連。建議_only_對WPF窗口中的更改作出反應。不顯示SetupBuilderModelView類中的更改。 – dutop 2011-03-29 07:39:25

回答

0

您最近的評論讓我想起this question。在他的回答,馬克·波拉克(Spring開發)建議把這個在你的配置:

<aop:config proxy-target-type="true"> 

這將創建一個基於繼承的代理。默認情況下,Spring AOP會爲您的類創建一個基於組合的代理,因此任何內部方法都不會被攔截,因爲實例具有對自身的引用,而不是Spring創建的代理。

請注意,事件不會自動從目標傳播到代理。這可能(可能)爲什麼來自模型的更改不會傳播到您的wpf窗口:模型會觸發屬性更改,但窗口綁定到代理。在spring-aop-mvvm-foundation-propertychanged的問題中,我試圖詳細解釋這個問題,並提出了一個(hackish)解決方法。

+0

我真的很好奇,如果這適合你。目前的文檔([aop 13.6](http://www.springframework.net/doc-latest/reference/html/aop.html#aop-proxy-mechanism))建議不,但馬克的答案表明它會起作用。 – Marijn 2011-03-29 13:44:31

+0

不要忘記將任何想要截取的方法/屬性聲明爲虛擬。 – Marijn 2011-03-29 13:45:02

+0

你應該使用彈簧1.3.1或更高版本。 – Marijn 2011-03-29 13:47:38