2009-08-19 48 views
1

使用Windows窗体控件和LINQ时,您的Buisiness Layer如何返回数据的“最佳选项”?Windows窗体控件和LINQ;我应该返回什么?

现在我正在返回DataTables,以便可以将DataSource设置为返回的DataTable。有更好的选择吗?为什么?

public class BLLMatrix 
{ 
    public static DataTable GetMaintItems(int iCat) 
    { 
     IQueryable<tblCaseNotesMaintItem> tItems = DALMatrix.GetCNTable(); 
     return 
      (tItems.Where(item => item.CategoryID == iCat & item.IsActive).OrderBy(item => item.OrderID).Select(
       item => new { item.ItemID, item.ItemDescription })).CopyLinqToDataTable(); 
    } 

internal static class DALMatrix 
{ 
    internal static MatrixDataContext MatrixDataContext = new MatrixDataContext(); 

    internal static Table<tblCaseNotesMaintItem> GetCNTable() 
    { 
     return MatrixDataContext.GetTable<tblCaseNotesMaintItem>(); 
    } 

我发现这个类似的问题 - >Separating concerns with Linq To SQL and DTO's

回答

4

就个人而言,我更喜欢数据传输对象,但数据集在紧要关头。基本上,这个想法是,如果你正在使用数据传输对象(它没有逻辑,并且代表了你希望在客户端上使用的模型),那是一个可以生活的抽象,不管前端或后端的变化。这通常是一个好主意。

数据集很有用,但由于基于数字/字符串的字段访问,它们缺乏编译时安全性(不是强类型的DataSet),这可能会造成问题。

通常,与数据传输对象相比,通过导线序列化数据集还有大量开销。

+0

当你说包含DataTables的DataSet时,正确吗?另外,你有没有DTO的好例子?我会谷歌,但如果你有一个好的,我更喜欢推荐... – 2009-08-19 15:29:49

+1

@Refracted圣骑士:维基百科有一个很好的条目在数据传输对象在这里:http://en.wikipedia.org/wiki/Data_transfer_object有一个很好的文章于2009年8月发布的MSDN标题“数据传输对象的优点和缺点”,位于:http://msdn.microsoft.com/zh-cn/magazine/ee236638.aspx – casperOne 2009-08-19 15:35:32

1

由于DataSets的开销,我喜欢创建自己的模型类。如果你返回一个对象数组(或者任何实现了IList接口的东西),你仍然可以设置它等于大多数ASP.NET元素的DataSource属性。

+0

*“大多数ASP.NET元素。 “* ....是否适用于WinForm控件? – 2009-08-19 15:26:56

+0

WinForm元素应该也能够使用IList的对象。 – CSharpAtl 2009-08-19 15:32:15

+0

谢谢,我会研究它。 – 2009-08-19 15:41:16

1

我个人比较喜欢使用链接List<YourObject>

1

我喜欢的业务逻辑返回一个对象的实例,如汽车,ICAR或列表(CAR)时设置我的数据源让DAL填充对象您。这样你就可以在数据和用户界面之间保持清晰的分离。

1

我喜欢使用DataReaders而不是数据集,我将使用数据层中的迭代器块将数据读取器转换为IEnumerable<IDataRecord>。从那里开始,我在业务层和数据层之间进行了一些额外的步骤,将IEnumerable转换为IEnumerable<MyBusinessObject>。您应该可以将其传递到表示层以进行数据绑定。

我喜欢这种方法,因为它在分离数据层和业务层方面做得更好:业务层不应该考虑数据集,数据层也不应该知道如何构建业务对象。如果我认为这是一个单独的层次,我可以获得两全其美的好处。对数据层或业务层的更改意味着我只需要为该构造改变我的业务对象的工厂代码。

相关问题