将DataReaders传递给构造函数是否可以?

Sis*_*utl 5 c# constructor sqldatareader

我正在维护一些C#2.0代码,程序员通过打开DataReader然后将其传递给对象的构造函数来使用读取业务对象集合的模式.我看不出任何明显的错误,但对我来说感觉很糟糕.这样可以吗?

private static void GetObjects()
{
    List<MyObject> objects = new List<MyObject>();
    string sql = "Select ...";
    SqlConnection connection = GetConnection();
    SqlCommand command = new SqlCommand(sql, connection);
    connection.Open();
    SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
    while (reader.Read())
        objects.Add(new MyObject(reader));
    reader.Close();
}

public MyObject(SqlDataReader reader)
{
    field0 = reader.GetString(0);
    field1 = reader.GetString(1);
    field2 = reader.GetString(2);
}
Run Code Online (Sandbox Code Playgroud)

Bev*_*van 5

通过将DataReader传递给对象的构造函数,您可以在业务对象和您选择的持久性技术之间建立非常紧密的耦合.

至少,这种紧密耦合将使重用和测试变得困难; 在最坏的情况下,它可能导致业务对象对数据库了解太多.

解决这个问题并不太困难 - 您只需将对象初始化移出构造函数并进入不同的工厂类.

  • 我认为在方法构造函数中将SqlDataReader更改为IDataReader对于修复它也有很长的路要走.IDataReader非常通用,不能与任何底层持久性技术联系在一起. (3认同)