Spring.net AOP, кажется, мешает привязке данных WPF - PullRequest
1 голос
/ 29 марта 2011

Я обновил свой проект с помощью Spring.net Dependency Injection Framwork.Затем я продолжил интеграцию AOP, чтобы включить простой механизм ведения журнала / трассировки.У меня были некоторые проблемы с циклической зависимостью в моем app.config, но я решил:

<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");
        }
    }
...
}

Вот объект Model, назначенный моему главному окну 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();
    }
}

Но если происходят изменения в объекте "Model", мое окно WPF больше не обновляется!Недвижимость изменилась.Событие PropertyChanged генерируется, и кто-то подписался на него.Но никто не пытается получить значения свойства.Механизм трассировки / ведения журнала работает, get_Customer() вызывается только один раз при запуске, затем никогда.Я не понимаюSpring.Aop.Framework.ProxyFactoryObject должен передавать каждое событие от целевого объекта всем подписчикам, не так ли?Если это не проблема, и событие прибывает, проблема в собственности?Кеширует ли объект Proxy свойства цели?Я просто не понимаю.

Закомментированная строка в app.config была без AOP.Если я прокомментирую строку выше и раскомментирую эту строку, все будет нормально.

Если у вас есть идеи, пожалуйста, дайте мне знать.Я надеюсь, что предоставил достаточно, но не слишком много информации.Если вам нужна дополнительная информация, я был бы рад предоставить ее.

1 Ответ

0 голосов
/ 29 марта 2011

Ваш последний комментарий напоминает мне этот вопрос .В своем ответе Марк Поллак (разработчик Spring) предлагает добавить это в вашу конфигурацию:

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

Это создаст прокси на основе наследования.По умолчанию Spring AOP создает основанный на композиции прокси для вашего класса, поэтому любые внутренние методы не перехватываются, поскольку экземпляр имеет ссылку на себя, а не на созданный Spring прокси.

Обратите внимание, что события неt автоматически распространяется от цели к прокси.Это (вероятно), почему изменения в вашей модели не распространяются на ваше окно wpf: модель запускает изменение свойства, но ваше окно привязано к прокси.В вопросе spring-aop-mvvm-foundation-propertychanged Я попытался объяснить это подробно и предложил (хакерский) обходной путь.

...