1

ドメインオブジェクトを表すインターフェースがあるとしましょう:

public interface IFoo
{
    Bar Bar { get; }
}

Bar型はオブジェクトのファミリーであり、それぞれがわずかに異なるスキーマを持っています。データベースでは、これは XML として表されます (これはモバイル アプリであるため、単純nvarcharに であり、真の XML 列ではありません)。

および対応するオブジェクトDataSetを含む生成済みがあります。FooDataTableFooRow

// AcmeDataSet.designer.cs

public partial class FooRow : DataRow
{
    public string BarXml
    {
        // Generated get and set
    }
}

IFooの逆シリアル化されたインスタンスを実装してキャッシュしたいと思いますBar:

// FooRow.cs

public partial class FooRow : IFoo
{
    private Bar _bar;

    Bar IFoo.Bar
    {
        get { return _bar; }
    }
}

部分クラス内から、 の値BarXmlが変更されたことをどのように判断できますか?

FooDataTableイベントが含まれColumnChangingていることColumnChangedはわかっていますが、それらをサブスクライブする方法がわかりません。Linq to Sql のOnCreated部分メソッドに類似するものはなく、生成されたコンストラクターにフックする別の方法を知りません。

4

1 に答える 1

3

私があなたを正しく理解している場合、FooRow オブジェクト (インスタンス) は Type DataRow から派生した型のインスタンスです... その場合、DataRow には DataTable を参照するプロパティがあるため、IFoo 変数を DataRow にキャストするだけです。 、

FooRowの内部

  public partial class FooRow
  {    
       private void myColumnChanging Handler(object sender, EventArgs e)
       {
            // Implementation
       }
       private void myColumnChanged Handler(object sender, EventArgs e)
       {
            // Implementation
       }
       public void RegisterEvents()
       {
          ((DataRow)this).Table.ColumnChanging += myColumnChanging; 
          ((DataRow)this).Table.ColumnChanged += myColumnChanged; 
       }
   }

次に、FooDataTable クラスで、新しいファクトリ メソッド MyNewFooRow() を追加します。

public class FooDataTable 
{
    //  -- Other implementation
    public FooRow MyNewFooRow()
    {
        FooRow fr = this.NewFooRow(); // call the original factory
        fr.RegisterEvents();
        return fr;
    }
 }

古い工場を使用していた場合は、この新しい工場を使用してください...

于 2008-12-01T19:54:40.453 に答える