【问题标题】:Serialize IEnumerable<T> through the wire?通过电线序列化 IEnumerable<T>?
【发布时间】:2010-11-18 14:35:33
【问题描述】:

我正在使用一个分布式 Web 应用程序,其中一个数据库服务器包含 SQL Server 2005 数据库,一个我们安装了 Microsoft 三层服务应用程序的应用程序服务器,以及一个我使用 MVP 和监督控制器的 Web 服务器。

当我请求假设国家/地区的列表时,我的服务层在应用程序服务器上返回IEnumerable&lt;Country&gt;。服务层调用数据访问组件,产生如下实体:

public virtual IEnumerable<T> FillList(DbCommand command, DataContext context)
{
    using (IDataReader dataReader = this.ExecuteReader(command, context))
    {
        while (dataReader.Read())
        {
            T entity = this.Fill(dataReader, context);
            yield return entity;
        }
    }
}

我现在有点担心与我的数据库的连接,因为当我通过 WCF 将实体序列化到我的控制器时它会保持打开状态。我的第一个问题是,在逐个实体将实体序列化到我的控制器时,是否真的需要让我的数据库连接保持打开状态?这个解决方案的优点是我可以在大型集合上使用 LINQ(不是 LINQ to SQL)。

我想出了这个解决方案:在服务层,我总是返回一个List,像这样:

public virtual List<T> GetList()
{
    List<T> list = new List<T>();
    list.AddRange(this.dataAccess.GetList()));
    return list;
}

但是在这里我将一个完整的列表返回给控制器,也许我只需要列表中的一些项目。我的第二个问题是这是否是一个好的设计?

期待您的建议!

【问题讨论】:

  • 什么是“Microsoft 三层服务应用程序”?谷歌对这个词的唯一打击是this question!

标签: wcf serialization ienumerable


【解决方案1】:

我认为设计没有任何特殊问题。

当然,您需要注意TList&lt;T&gt; 中的含义。不要返回具有各种行为的对象列表,也不要返回特定于 .NET 的类型 - 例如,DataSetDataTable 是个坏主意。使用具有原始类型属性的简单类,原始类型的列表和数组,这些简单类的列表和数组等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2011-02-19
    • 2018-07-30
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多