2011-03-29 89 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