2011-07-21 7 views
2

私は、コンテキストにバインドされたオブジェクトから継承されるクラスを持っています。クラスにはいくつかのプロパティの属性があります。プロパティが変更されると、PostProcess(IMessage msg, IMessage msgReturn)はイベントを発生させ、同じ属性を持つ新しいプロパティが再度発生します。 2回目の変更には​​も必要ですが、それは起こっていません。おそらく、2番目のプロパティが変更されたオブジェクトは元の.netオブジェクトではなく、MarshalByRefObject/ContextBoundObject/Proxy Objectです。私の質問は、元のオブジェクトにプロキシをキャストする方法です。私はキャストしてSynchonizationAttributeを試しましたが、それは役に立ちません。 Asyncの方法でイベントが実行されているので、コードの実行をブロックせず、プロキシと元のオブジェクトが同じアプリドメインに存在することを通知するだけです。イベントチェーン/元のオブジェクトへのプロキシ

2つ目のオブジェクトを参照しようとしましたが、最初のプロパティを変更すると2番目のプロパティを変更しようとしましたが、​​を呼び出しませんでした。

基本的には、さまざまなオブジェクトが他のオブジェクトのプロパティに依存するツリーを作成する必要があります。いずれかのプロパティが変更されると、ウォッチャーがトリガーされ、ウォッチャーが見つからなくなるまでチェーンのように広がる可能性があります。 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); 

          }); 
      } 
    } 

Mainメソッド

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

私が達成したいものを実装するための代替またはより良い方法を提案してください。

+0

問題の内容が100%明確ではありません。 –

答えて

1

ObserverがSubjectのステータス通知を購読しているobserver patternに非常に近いようです。

このパターンでは、b1.IsOn = trueにはオブザーバを循環して変更が通知されるコードが含まれています。私はあなたが1つのオブジェクトの多くのプロパティを観察したい場合は、通知コードをカプセル化することができますね。その後b1.IsOnだけのようなものを言う単一の行を持つことができます:

this.SendNotification("IsOn", Value); 

これは、パターン上に読めば、あなたがもう少し感じに終わるかもしれない...たくさん何をやっているように思えます自信を持って、コードを標準化するためにいくつかの変更を加えることができます。

ところで、このために.Netに組み込まれているものがあります - IObservable(T)。私はこれを使わなかったが、それは強く見える。

+0

電球とスイッチの両方がContextBoundObjectから継承され、watchableオブジェクトのupdateメソッドを呼び出すために属性を利用します。それはMainメソッドからは適切ですが、他のオブジェクトを変更した場合はUpdateメソッド内でMessageSinkのPostProcessメソッドを呼び出さない – hungryMind

+0

[Watchable]でクラスをデコレートし、そのプロパティをすべて自動的に観測できるようにしたいのですか?私はまだ本当に不明です。私はContextBoundQuestionが必要です。 :) –

関連する問題