将 TableAdapter 与基类、接口或部分类一起使用的更智能方法

Posted

技术标签:

【中文标题】将 TableAdapter 与基类、接口或部分类一起使用的更智能方法【英文标题】:Smarter ways to use TableAdapter with base-class, interface or partial class 【发布时间】:2009-12-04 14:15:01 【问题描述】:

C# ADO.Net TableAdapter 对象不实现接口或基类(组件除外)。

有没有人在 (GoF) 模板模式的应用程序中使用过 TableAdapter?

更新: 我想解决这里描述的问题:Help to improve a migration program 通过使用模板模式 (GoF), 适配器模式 (GoF) 或其他不错的模式。

【问题讨论】:

你能给我们一个你想做的例子吗? “以类似模板的模式使用 TableAdapter”意味着什么并不明显。 (典型的 Gang of Four 模板方法模式,en.wikipedia.org/wiki/Template_method_pattern?) @Jeff Sternal:你是对的。更新描述 【参考方案1】:

TableAdapter 没有具体的基类或接口。但是 MS 的家伙足够聪明,可以部分离开。因此,您可以使用分部类来使用 TableAdapter。我们遇到了类似的问题,我们想编写可以处理数据模型中所有表适配器的通用代码。我们做了如下。

1.) 定义了一个接口 ITableAdapter

public interface ITableAdapter<TDataTable> : IDisposable
    where TDataTable : DataTable

    void AttachTransaction(SqlTransaction _transaction);
    SqlTransaction CreateTransaction();

    int Update(TDataTable _dataTable);

    TDataTable GetData();
    TDataTable GetById(int Id);

2.) 后来我们为项目中的每个表适配器创建了部分类,并为它们实现了这个接口

public partial class UsersTableAdapter : ITableAdapter<FileParkDataSet.UsersDataTable>

    #region ITableAdapter<UsersDataTable> Members

    public void AttachTransaction(SqlTransaction _transaction)
    
        if (this.Adapter == null)
            this.InitAdapter();

        this.Adapter.InsertCommand.Transaction = _transaction;
        this.Adapter.UpdateCommand.Transaction = _transaction;
        this.Adapter.DeleteCommand.Transaction = _transaction;

        foreach (var _cmd in this.CommandCollection)
        
            _cmd.Transaction = _transaction;
        
    

    public SqlTransaction CreateTransaction()
    
        if (this.Connection.State != ConnectionState.Closed)
            this.Connection.Close();
        this.Connection.Open();

        return this.Connection.BeginTransaction();
    

    #endregion

现在您可以针对 ITableAdapter 进行编程了。

【讨论】:

嘿,它是局部的?太好了! 是的 - 我可以想象你的快乐。我们费了很大劲才找到解决这个问题的方法。最后我们发现 TableAdapters 是不完整的。 @this.__curious_geek:太好了! +1 您能准确解释一下如何在适配器中使用通用 FileParkDataSet.UsersDataTable 吗? 可能值得注意的是,Microsoft 打算让 TableAdapter 通过成为 used inside a TransactionScope 来参与事务,而不是专门将每个 tableadapter 注册到特定于连接的数据库事务中【参考方案2】:

与大部分 BCL 一样,由于您无权访问内部,因此您需要定义自己的类层次结构并减少对 BCL 类的直接引用。

Adapter pattern 之类的东西可能适合您的需求:使用它来“包装”TableAdapter,然后您可以将其用作模板。

【讨论】:

我是唯一一个希望有人在 Microsoft 清醒并刚刚使 ITableAdaptor 成为一件事的人,这样我们就不必适配适配器了。如果有人调整了我的适配适配器,我可能不得不 plotz。

以上是关于将 TableAdapter 与基类、接口或部分类一起使用的更智能方法的主要内容,如果未能解决你的问题,请参考以下文章

可以将派生类对象视为与基类相同类型吗? <noobieQ/>

将Abp移植进.NET MAUI项目:配置与基类编写

JAVA基础--继承

python 抽象类和接口类

多态的课后总结

C#编程,关于基类和派生类