通过线路序列化IEnumerable <t>?</t>

时间:2009-08-11 12:41:39

标签: wcf serialization ienumerable

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

我请求服务器上的服务层,当我请求列表中的国家/地区时,会返回IEnumerable<Country>。服务层调用数据访问组件,产生如下实体:

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 to SQL)上使用LINQ。

我提出了这个解决方案:在服务层,我总是返回一个List,如下所示:

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

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

期待您的建议!

1 个答案:

答案 0 :(得分:0)

我没有看到设计有任何特殊问题。

当然,您需要注意TList<T>的内容。不要返回具有各种行为的对象列表,也不要返回特定于.NET的类型 - 例如,DataSetDataTable是个坏主意。使用具有基本类型属性的简单类,基元类型的列表和数组,这些简单类的列表和数组等。