【问题标题】:Chain of events / Proxy to original object事件链/原始对象的代理
【发布时间】:2011-10-10 13:06:15
【问题描述】:

我有一个从上下文绑定对象继承的类。类具有某些属性的属性。当某些属性发生更改时,PostProcess(IMessage msg, IMessage msgReturn) 会引发一个事件,并再次从该事件中触发具有相同属性的新属性。第二个更改也应该调用PostProcess,但它没有发生。可能是因为,更改第二个属性的对象不是原始 .net 对象,而是MarshalByRefObject / ContextBoundObject / Proxy Object。我的查询是如何将代理转换为原始对象。我试过铸造和SynchonizationAttribute,但它没有帮助。只是为了让您知道事件以Async 方式执行,因此它不会阻止代码执行,并且代理和原始对象都存在于同一应用程序域中。

我尝试了两个对象,一个持有第二个的引用,当第一个的属性改变时,它尝试改变第二个的属性,但它没有调用PostProcess

基本上我需要制作一棵树,其中各种对象取决于其他对象的属性。并且当任何一个属性发生变化时,它都应该触发它的观察者,这可以像链一样传播,直到找不到观察者。我正在尝试使用 ContextBoundObject。

示例:

public class PowerSwitch : ObjectBase
{
    [Watchable]
    public bool IsOn { get; set; }
    public bool IsWorking { get; set; }
}

public class Bulb : ObjectBase
{
    public Color Color { get; set; }
    [Watchable]
    public bool IsOn { get; set; }
    protected override void Update(object sender, PropertyChangeEventArgs e)
    {
        ((Bulb)this).IsOn = !((Bulb)this).IsOn; 
          //<-- b1.update should be called after this, but it is not
    }
}

[Watchable]
public class ObjectBase : ContextBoundObject
{
     public virtual void Watch(ObjectBase watch, string propertyName)
     {
         watch.Watcher.Add(this, propertyName);
     }

     protected virtual void Update(object sender, 
                            PropertyChangeEventArgs e) { }

     public Dictionary<ObjectBase, string> Watcher
                      = new Dictionary<ObjectBase, string>();

     internal void NotifyWatcher(
             PropertyChangeEventArgs propertyChangeEventArgs)
     {
          Watcher.Where(sk => sk.Value == propertyChangeEventArgs.Name)
                        .ToList()
                        .ForEach((item) =>
                        {
                            item.Key.Update(this, propertyChangeEventArgs);

                            });
          }
    }

主要方法

        PowerSwitch s1 = new PowerSwitch();
        Bulb b1 = new Bulb();
        b1.Watch(s1, "IsOn");
        s1.IsOn = true; //<-- b1.update is called after this

请提出替代或更好的方法来实现我想要实现的目标。

【问题讨论】:

  • 我不是 100% 清楚问题是什么。

标签: c# proxy context-bound


【解决方案1】:

看起来您非常接近observer pattern,观察者订阅主题的状态通知。

在该模式中,b1.IsOn = true 将包含循环通过观察者并通知他们更改的代码。我想如果你想观察一个对象的很多属性,你可以封装通知代码。然后 b1.IsOn 可能只有一行内容如下:

this.SendNotification("IsOn", Value);

这看起来很像您正在做的事情...如果您阅读了该模式,您最终可能会感到更加自信,也许您可​​以进行一些更改以标准化您的代码。

顺便说一句,.Net 中为此内置了一些东西——IObservable(T)。这个我没用过,但是看起来很强大。

【讨论】:

  • bulb 和 Switch 都继承自 ContextBoundObject,并利用属性调用 watchable 对象的更新方法。它在 Main 方法中正确执行,但在 update 方法中,如果我修改任何其他对象,它不会调用 MessageSink 的 PostProcess 方法
  • 所以你希望能够用 [Watchable] 装饰一个类,然后让它的所有属性自动 Observable?我还是很不清楚。我需要一个 ContextBoundQuestion。 :)
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 2023-02-23
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2018-02-13
相关资源
最近更新 更多