4

我正在尝试将遗留的 C# .NET 1.1 应用程序带入现代时代。我们使用 DataTables 来收集可能是业务对象的内容。

鉴于大多数代码都认为它正在与 DataRow 的接口通信,那么什么样的泛型集合才能实现最不痛苦的转换?

4

4 回答 4

7

如果我正确地阅读了您的问题,那么您正在询问哪个容器将只存储您的业务对象列表,然后允许您仅枚举集合,或通过索引进行选择。

好吧,我会考虑查看 List<>

您的方法将接受 IList<> (访问索引)或 IEnumerable<> (在集合上使用 foreach 循环)

例如

private void PrintAll<T>(IEnumerable<T> items)
{
    foreach(T item in items)
        Console.WriteLine(item.ToString());
}

现在我可以传入任何使用 IEnumerable<> 接口的容器,包括 List<> 和普通数组

例子

List<Person> people = new List<Person>();
//add some people to the list
PrintAll<Person>(people);

带有业务对象的示例 n 层应用程序

高温高压

骨头

于 2008-12-19T04:31:15.833 回答
4

与其放弃 DataSet/DataTable API,为什么不将 DataTable 和 DataRow 子类化为适合您的业务逻辑的类型呢?

对子类 DataRow 和 DataTable 对象的支持非常出色。您将在新代码中获得所需的强类型,以及旧代码的向后兼容性。此外,您可以在需要/想要的任何地方注入业务逻辑。

于 2008-12-19T04:27:12.627 回答
2

如果你习惯了DataTable,想必你习惯了适配器(etc)带来的变化跟踪和持久性支持。在这种情况下,您是否考虑过 LINQ-to-SQL 和/或实体框架?它们都支持丰富的变更跟踪和自动持久性,同时提供各种其他 DAL 用例,例如可组合查询和所有其他 LINQ 优点。

绝对值得调查。

请注意,更改为类型化的 POCO 实体(即不是DataRow其子类)仍然是一个很大的偏差,因此它不会是一个简单的更改。如果您没有时间进行重大更改,那么坚持下去DataTable(也许是打字)将是务实的。

这将为您提供EntitySet<T>,IQueryable<T>等,或者您可以只使用List<T>,Collection<T>等来临时使用。

于 2008-12-19T08:37:37.300 回答
2

将您的“应用程序带入现代时代”的最简单方法是将代码从 Visual Studio 2003 升级到 2005 或 2008。如果您希望向您的类添加行为(“可能是业务对象”)事实上,DataSet、DataTable 和 DataRow 是作为部分类实现的。

上面提到的解决方案会为您失去很多东西,包括更改跟踪,除非那是您正在寻找的东西——在很大程度上偏离。LINQ to SQL、实体框架等都提供了更改跟踪,但在连接到数据库的工作单元机制内,而不是像 DataRow 那样将工作单元跟踪直接放在您的对象上。

希望你不是简单地改变以将你的“应用程序带入现代时代”,并且你有一些你试图为你放弃的功能和你付出的努力而获得的好处?

顺便说一句,这一切都假设您使用的是类型化数据集……在我看来,对于大多数用途来说,非类型化数据集对象有点傻。

于 2009-01-09T16:49:14.653 回答