您发布的代码中有几个问题。我将尝试提供一组简化的代码,但是如果您将这部分代码的各种需求(关注点)分开,您会发现许多不同的类,但我离题了。
首先,您不希望使用 COPY-PASTE 在应用程序中到处传播连接字符串。您应该创建一个专门的类来处理这个问题。
public class DatabaseGateway
{
public IList<T> RetrieveSqlAs<T>(string queryString, ITransformer<SqlDataReader, T> rowTransformer)
{
var result = new List<T>();
using (var sqlConn = new SqlConnection(connectionString)) // you can use a CONSTANT, or call to a .config file here
using (var sqlCommand = new SqlCommand(queryString, sqlConn))
{
var myreader = sqlComm.ExecuteReader();
while (myreader.Read())
{
result.Add(rowTransformer.Transform(myreader));
}
}
return result;
}
}
public class MemberRowTransformer : ITransformer<SqlDataReader, string>
{
public string Transform(SqlDataReader from)
{
from["members"]; // handle null and anything else here
}
}
public interface ITransformer<TFrom, TTo>
{
TTo Transform(TFrom)
}
然后你像这样使用它:
var gateway = new DatabaseGateway();
var transformer = new MemberRowTransformer();
cmb.Items.Clear();
foreach (string i in gateway.RetrieveSqlAs("SELECT members FROM dbo.tbl_Category", transformer))
{
cmb.Items.Add(i);
}
如果到目前为止你和我在一起,请朝着Repository Pattern
. 添加这个类:
public class MembershipRepository
{
public List<string> GetMembers()
{
var gateway = new DatabaseGateway();
var transformer = new MemberRowTransformer();
var result = new List<string>();
foreach (string i in gateway.RetrieveSqlAs("SELECT members FROM dbo.tbl_Category", transformer))
{
result.Add(i);
}
return result;
}
}
然后您的调用代码变为:
var repository = new MembershipRepository();
cmb.Items.Clear();
foreach(string i in repository.GetMembers())
{
cmb.Items.Add(i);
}
如果您研究以下主题:泛型、存储库模式和数据传输对象 (DTO),您会发现许多关于如何创建可以重用而不是复制代码的类的好主意。
注意:我还没有完成将事物拆分为接口的整个练习,以便您可以轻松进行单元测试和依赖注入,这是一个更大的主题,但也是一件好事!