Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在BLL或UI中使用Linq到SQL实体?_Wpf_Linq To Sql_Repository Pattern_Data Access Layer_Dao - Fatal编程技术网

Wpf 在BLL或UI中使用Linq到SQL实体?

Wpf 在BLL或UI中使用Linq到SQL实体?,wpf,linq-to-sql,repository-pattern,data-access-layer,dao,Wpf,Linq To Sql,Repository Pattern,Data Access Layer,Dao,前几天,我有一位客户询问我如何构建一个简单的WPF LOB应用程序。他们基本上想要一个用于数据库的CRUD应用程序,主要目的是作为WPF培训项目 我还向他们展示了LINQtoSQL,他们对此印象深刻 然后我解释了直接从其BLL或UI代码中使用L2S实体可能不是一个好主意。他们应该考虑一些类似于存储库模式的东西。 在这一点上,我已经可以感觉到过度工程的警钟在他们的头脑中响起,在某种程度上也在我的头脑中响起。对于一个简单的CRUD应用程序,他们真的需要这么复杂吗?好吧,它实际上是一个WPF培训项目,

前几天,我有一位客户询问我如何构建一个简单的WPF LOB应用程序。他们基本上想要一个用于数据库的CRUD应用程序,主要目的是作为WPF培训项目

我还向他们展示了LINQtoSQL,他们对此印象深刻

然后我解释了直接从其BLL或UI代码中使用L2S实体可能不是一个好主意。他们应该考虑一些类似于存储库模式的东西。

在这一点上,我已经可以感觉到过度工程的警钟在他们的头脑中响起,在某种程度上也在我的头脑中响起。对于一个简单的CRUD应用程序,他们真的需要这么复杂吗?好吧,它实际上是一个WPF培训项目,但让我们假装它变成了一个真正的应用程序

您是否认为在整个应用程序中使用L2S实体是可以接受的? 根据经验,在以后使用另一个持久性框架进行重构有多困难? 在我看来,如果UI层使用L2S实体作为一个简单的POCO,而不涉及任何L2S特定的方法,那么如果需要的话,以后应该很容易重构

他们确实需要一种集中L2S查询的方法,因此需要某种管理方法,即使他们直接使用L2S实体。因此,在某种程度上,我们已经在推动DAL/DAO/Repository的某些方面

我看到的回购协议的主要问题是L2S实体和某些领域模型之间的映射问题。这真的值得吗?你可以免费得到很多L2S实体,我认为一旦你映射到另一个模型,就很难使用它们


想法?

基本上,我们为一个项目所做的是,我们有一个业务层,负责处理所有临清至L2S的对象。。。从本质上讲,通过管理器对象将所有查询集中到一个层,我想这有点类似于存储库


我们没有使用DTO映射到L2S;因为我们觉得在这个项目中付出的努力是不值得的。我们的部分逻辑是,随着越来越多的ORM支持Iqueryable和与L2S类似的语法,例如实体框架,那么切换到不同的ORM可能不会那么糟糕,因此sin也没那么糟糕。

基本上,我们为一个项目所做的是,我们有一个业务层,负责处理所有的L2S对象。。。从本质上讲,通过管理器对象将所有查询集中到一个层,我想这有点类似于存储库


我们没有使用DTO映射到L2S;因为我们觉得在这个项目中付出的努力是不值得的。我们的部分逻辑是,随着越来越多的ORM支持Iqueryable和与L2S类似的语法,例如实体框架,那么切换到不同的ORM可能不会那么糟糕,所以我认为这不是一件坏事。

存储库不是什么大问题。有关在ASP.NET MVC中使用它们的详细介绍,请参见此处:


存储库不是什么大问题。有关在ASP.NET MVC中使用它们的详细介绍,请参见此处:

您是否认为在整个应用程序中使用L2S实体是可以接受的

那要看情况。如果你做一个短寿命的产品,如果你使用L2S的话,你可以很快地把它连接起来。但是,如果您要开发一个可能需要长期维护的长寿命产品,那么您最好考虑一个合适的持久性层

根据经验,在以后使用另一个持久性框架进行重构有多困难

如果您在所有层中都使用L2,那么您就不能考虑将它们重新分解以使用另一个持久性框架。这正是在持久性层中使用NHibernate或Entity framework之类的框架的优点,尽管它需要在前期付出一些额外的努力,但从长远来看,它将很容易维护

您是否认为在整个应用程序中使用L2S实体是可以接受的

那要看情况。如果你做一个短寿命的产品,如果你使用L2S的话,你可以很快地把它连接起来。但是,如果您要开发一个可能需要长期维护的长寿命产品,那么您最好考虑一个合适的持久性层

根据经验,在以后使用另一个持久性框架进行重构有多困难


如果您在所有层中都使用L2,那么您就不能考虑将它们重新分解以使用另一个持久性框架。这正是在持久层中使用NHibernate或Entity framework之类的框架的优点,尽管它需要一点额外的前期工作,但从长远来看很容易维护

始终使用L2S实体的唯一主要缺点是您的UI需要了解并绑定到具体实体。这意味着您的UI了解您的数据层。通常不是个好主意。你真的需要一个分层的方法来处理任何可能严重的事情

也就是说,在l中使用LINQ到SQL实体本身是完全可能的 分层体系结构,不了解数据层:提取实体的接口并绑定到它们

请记住,所有L2S实体都是分部类。创建反映实体的接口Refactor=>Extract Interface是您的朋友,并为实现接口的实体创建部分类定义。将接口本身以及仅将接口放在UI和业务层引用的单独的.DLL中。让您的业务层和数据层接受并发出这些接口,而不是它们的具体版本。您甚至可以让接口实现InotifyPropertyChange,因为L2S实体本身实现了这些接口。一切都很顺利


然后,当/如果您需要一个不同的持久性框架时,您在BL或UI中一点也不痛苦,只在数据层——这是您想要的

始终使用L2S实体的唯一主要缺点是UI需要了解并绑定到具体实体。这意味着您的UI了解您的数据层。通常不是个好主意。你真的需要一个分层的方法来处理任何可能严重的事情

也就是说,完全可以在分层体系结构中使用LINQ to SQL实体本身,而不需要了解数据层:提取实体的接口并绑定到它们

请记住,所有L2S实体都是分部类。创建反映实体的接口Refactor=>Extract Interface是您的朋友,并为实现接口的实体创建部分类定义。将接口本身以及仅将接口放在UI和业务层引用的单独的.DLL中。让您的业务层和数据层接受并发出这些接口,而不是它们的具体版本。您甚至可以让接口实现InotifyPropertyChange,因为L2S实体本身实现了这些接口。一切都很顺利


然后,当/如果您需要一个不同的持久性框架时,您在BL或UI中一点也不痛苦,只在数据层——这是您想要的

听起来您应该考虑WPF的ViewModel模式


听起来您应该考虑WPF的ViewModel模式


我认为,在这种情况下,它们不是什么大不了的原因是它们直接使用L2S实体作为域模型。我想很多人都不赞成这一点。但是它的启动和运行速度肯定很快,并且可能在这个项目上工作得很好。它是否合适取决于项目的规模。在小型项目中,我有一个包含30个表的项目,StackOverflow至少有这么多表,L2S实体可以很好地工作。我认为在这种情况下它们不是什么大问题的原因是它们直接使用L2S实体作为域模型。我想很多人都不赞成这一点。但是它的启动和运行速度肯定很快,并且可能在这个项目上工作得很好。它是否合适取决于项目的规模。在小型项目中,我有一个包含30个表的项目,StackOverflow至少有这么多表,L2S实体可以正常工作。使用WPF,用户界面实际上不需要在很大程度上了解具体实体,这要感谢强大的数据绑定—使用接口的好主意,但是我想知道一般来说,围绕L2S部分类构建模型是否有任何痛点。我注意到的第一个痛点是,如果L2S文件是Foo.dbml,那么using语句必须位于部分类文件的名称空间声明中,通常是Foo.cs,否则设计器会崩溃。但最大的痛点是联想;您必须构建一些将关联实体强制转换到其接口的实现,而创建关联树/层次结构可能比较粗糙。通常,最好在数据层中实现关联构建。此外,即使使用WPFs uber awesome数据绑定,您仍然需要对具体类进行引用。使用WPF,用户界面实际上不需要在很大程度上了解具体实体,这要感谢强大的数据绑定使用接口的好主意,但是我想知道一般来说,围绕L2S部分类构建模型是否有任何痛点。我注意到的第一个痛点是,如果L2S文件是Foo.dbml,那么using语句必须位于部分类文件的名称空间声明中,通常是Foo.cs,否则设计器会崩溃。但最大的痛点是联想;您必须构建一些将关联实体强制转换到其接口的实现,而创建关联树/层次结构可能比较粗糙。通常,最好在数据层中实现关联构建。此外,您还必须有一个re 对具体类的引用,即使使用WPFs uber可怕的数据绑定。