【问题标题】:Creating a Data Access class for multiple source types为多种源类型创建数据访问类
【发布时间】:2011-02-22 07:01:22
【问题描述】:

我需要创建一个类来接受数据源类型(MSSQL、Oracle、Access、Excel、ActiveDirectory、CSV 文件、Sharepoint 等)、该类型的连接详细信息,并返回与该数据源的连接。 之后我需要能够查询数据源并返回可用字段,最终能够从任何字段中提取数据。

我在想这听起来像是一个接口的工作,因为数据源类型的列表会随着时间的推移而增长,但我从未使用过接口。

这样可以吗?:

interface IConnectable
{
    void Connect();
}

class SourceMSSQL : RDB, IConnectable{}
class SourceOracle : RDB, IConnectable{}
class SourceAccess : RDB, IConnectable{}
class SourceExcel : RDB, IConnectable{}
class SourceCSVFile: FlatFile, IConnectable{}
class SourceSharePoint: FlatFile, IConnectable{}
class SourceActiveDirectory: FlatFile, IConnectable{}

另外,如何将 Read() 添加到该列表中?

PS:我只需要读,不会写。

【问题讨论】:

  • 您的问题有点令人困惑。您要在哪里添加 read() ?如果它是所有类共享的方法,则将其放入接口定义中
  • 那么您的评论是否意味着接口def中可以有多个方法?如果是,谢谢。我正在查看一些示例,因为它们都很简单,所以没有一个在 iface def 中定义了一个以上的方法。

标签: c# class-design generics


【解决方案1】:

是的,你在正确的轨道上。接口是一种规范,它允许您使用“未知”类,该类为您提供所需的服务,而无需绑定到您正在使用的服务(在这种情况下是哪种数据库类型)。

在您拥有的代码中,您将继续在您的界面上构建,例如:

interface IConnectable {
    IConnection Connect();
}

interface IConnection {
    IResultSet ExecuteQuery(string query);
}

然后用具体的类来实现这些。此外,您需要一个工厂来创建您需要的任何类:

class ConnectionFactory {
    IConnecable CreateConnection(...);
}

这样您就不必知道要创建哪个连接。

.NET 框架中已经提供了一些帮助。有一个 DbConnection 类,其子类如 SqlConnection 可能会有所帮助。还有一些框架可以帮助您连接(创建类并将它们关联在一起),但这是一个更高级的主题,以后可能会尝试 - 从为这些创建自己的接口和实现开始 - 这将更容易理解.

好主意!祝你好运!

附:为了能够轻松地重新配置您的软件以创建实现相同接口的不同对象(这通常是您想要的一种灵活性),您不想直接使用构造函数创建对象,而是有一个创建对象的中心位置。那个地方通常被称为工厂(它创建对象......)。工厂可以非常简单(可能只是查看配置字符串或命令行参数或任何控制您的行为的东西),或者更高级的复杂规则规定应在不同情况下使用哪些类。

有些框架为不同的情况提供了不同种类的工厂,structuremap link 是一个,MEF(包含在 .NET 4 中,可在 link 获得)是另一个。但不要从这个开始,它会让你一次考虑太多 - 你可以稍后添加它,因为你正在使用接口开始!

【讨论】:

  • 谢谢!请解释“你需要一个工厂”。我对此并不熟悉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2017-12-19
  • 2021-12-26
相关资源
最近更新 更多