.NET C#在应用程序中传输数据的最佳对象

时间:2015-07-31 00:35:30

标签: c# .net datatable ado.net dataview

出于可读性和可测试性的原因,我喜欢将我的应用程序代码组织成层 - 所以我有多个项目,每个项目都有多个文件夹结构,每个文件夹可能有多个类,名称空间符合拓扑。这里没什么特别的 - 大多数开发人员以类似的方式构建代码。

在我的纯数据层中,我需要执行T-SQL Stored Procedure来检索只读数据集 - 我只需要遍历行并读取列值。

在另一个层中,我需要对行集执行各种数据转换(例如:编写一个配置文件以提供给另一个应用程序)。

通常在我的数据层类中,我使用SqlDataReader来迭代行,提取列值,并在线执行数据转换。

但我更喜欢将此功能纳入单独的类中。

所以我需要一个断开连接的数据传输容器。可能性为DataSetDataTableDataViewDataRowCollection - 但也许这些对我来说都是过度的。

对于传输只读数据的最佳类有哪些建议?

1 个答案:

答案 0 :(得分:1)

您可以采用以下几种不同的策略:

  1. 使用LINQ to sql避免对行列表进行双重迭代(第一次传递以填充数据表或pocos列表,第二次传递给变换)
  2. 定义一个IDataTransformer接口并将其传递给您的数据访问加载方法,并让该方法使用转换器在从SqlDataReader加载数据时对数据进行整形。
  3. 将Entity Framework与自定义查询结合使用。
  4. 选项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