【问题标题】:Detecting DataRow changes from within a partial class从部分类中检测 DataRow 更改
【发布时间】:2010-09-24 19:44:05
【问题描述】:

假设我有一个表示域对象的接口:

public interface IFoo
{
    Bar Bar { get; }
}

Bar 类型是一组对象,每个对象的架构略有不同。在数据库中,这表示为 XML(这是一个移动应用程序,所以它只是 nvarchar不是真正的 XML 列)。

我有一个生成的DataSet,其中包含一个FooDataTable 和相应的FooRow 对象:

// 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 包含ColumnChangingColumnChanged 事件,但我不知道如何订阅它们。没有类似于 Linq to Sql 的 OnCreated 部分方法的类似物,我不知道还有其他方法可以挂接到生成的构造函数中。

【问题讨论】:

    标签: c# ado.net dataset partial-classes


    【解决方案1】:

    如果我对您的理解正确,那么您的 FooRow 对象(实例)是从 Type DataRow 派生的某种类型的实例...如果是这样,那么由于 DataRow 具有引用 DataTable 的属性,只需转换您的 IFoo 变量到一个数据行,

    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;
        }
     }
    

    并在您使用旧工厂的任何地方使用这个新工厂......

    【讨论】:

    • 如问题的最后一段所述,我知道这些事件,但不确定将代码放在何处以允许 FooRow 声明处理程序。
    • 对不起,我不太明白你的最后一段。你是什么意思“挂钩生成的 ctor”?如果生成的类派生自 DataRow,为什么需要?
    • 您不能将处理程序和订阅代码放在您使用 FooRow 实例的客户端代码中吗?
    • 构造函数是订阅这些事件的地方。生成的类已经有一个构造函数,所以我不能在我的部分类中重新定义一个。没有其他钩子,例如 Linq to Sql 中的 OnCreated,因此我无法在实例化时运行代码。
    • FooRow 是一个领域对象的实现,并单独负责实现 IFoo。从概念上讲,这种方法是合理的,但存在技术限制。外部化处理程序是我不愿意做出的妥协。 (以此类推,Linq to Sql 对象可以完全访问更改。)
    猜你喜欢
    • 2016-07-01
    • 2012-03-24
    • 1970-01-01
    • 2011-10-16
    • 2019-09-18
    • 2012-12-19
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多