出于可读性和可测试性的原因,我喜欢将我的应用程序代码组织成层 - 所以我有多个项目,每个项目都有多个文件夹结构,每个文件夹可能有多个类,名称空间符合拓扑。这里没什么特别的 - 大多数开发人员以类似的方式构建代码。
在我的纯数据层中,我需要执行T-SQL Stored Procedure
来检索只读数据集 - 我只需要遍历行并读取列值。
在另一个层中,我需要对行集执行各种数据转换(例如:编写一个配置文件以提供给另一个应用程序)。
通常在我的数据层类中,我使用SqlDataReader
来迭代行,提取列值,并在线执行数据转换。
但我更喜欢将此功能纳入单独的类中。
所以我需要一个断开连接的数据传输容器。可能性为DataSet
,DataTable
,DataView
,DataRowCollection
- 但也许这些对我来说都是过度的。
对于传输只读数据的最佳类有哪些建议?
答案 0 :(得分:1)
您可以采用以下几种不同的策略:
选项1和3有很多资源,所以我将在这里解决选项2.
假设您使用以下方法定义public interface ISomethingDataAccess
{
List<T> LoadAll<T>(Func<IDataReader, T> transformer);
}
接口:
transformer
IDataReader
参数将接受包含将接受T
并返回类型LoadAll<T>
的实例的回调的参数。
IDataReader
方法是一种通用方法,允许调用者确定将从List<T>
创建的对象的类型,然后填充到将返回的public class SqlSomethingDataAccess : ISomethingDataAccess
{
public List<T> LoadAll<T>(Func<IDataReader, T> transformer)
{
// ... Setup connection and command, etc ...
var returnList = new List<T>();
var reader = command.ExecuteReader(); // <- from setup steps above
while(!reader.MoveNext())
{
returnList.Add(transformer(reader));
}
return returnList;
}
}
中从方法。
在您的实施中,您可以执行以下操作:
public class SomethingBusiness()
{
public List<SomeTransformedThing> LoadAllSomethingsAsTransformedSomethings()
{
var returnList = this.dataAccess.LoadAll<SomeTransformedThing>
(reader=>new SomeTransformedThing()
{
// ... transform data from reader here
});
return returnList;
}
}
根据您的需要自定义方法。现在,您已将数据访问类之外的转换问题分开。
使用类似这样的东西:
openssl s_client -cert ./client-cert.pem -key ./client-key.key -CApath /etc/ssl/certs/ -connect foo.example.com:443