C# Linq到SQL、Web服务、网站-规划一切

C# Linq到SQL、Web服务、网站-规划一切,c#,web-services,linq-to-sql,C#,Web Services,Linq To Sql,我的项目的几个“部分”(exmaple的WinForms应用程序)使用我基于L2SQL编写的DAL。 我想在组合中加入几个Web应用程序,但问题是DAL“提供”的数据比Web应用程序需要的要多得多。更多 如果我将网站所需的数据打包到一个web服务中,而不是直接连接到DAL的网站,它将通过web服务访问DAL,这样可以吗 我觉得这会增加很多开销,但另一方面,我绝对不喜欢那种知道webapp拥有访问比实际需要多得多数据的“能力”的感觉 如有任何意见,将不胜感激。 非常感谢您的帮助。您可以创建web服

我的项目的几个“部分”(exmaple的WinForms应用程序)使用我基于L2SQL编写的DAL。 我想在组合中加入几个Web应用程序,但问题是DAL“提供”的数据比Web应用程序需要的要多得多。更多

如果我将网站所需的数据打包到一个web服务中,而不是直接连接到DAL的网站,它将通过web服务访问DAL,这样可以吗

我觉得这会增加很多开销,但另一方面,我绝对不喜欢那种知道webapp拥有访问比实际需要多得多数据的“能力”的感觉

如有任何意见,将不胜感激。
非常感谢您的帮助。

您可以创建web服务,也可以添加仅显示应用程序所需数据的层。存储库还有一个额外的好处,那就是它是一个解耦层,可以更容易地对应用程序进行单元测试(通过提供一个模拟存储库)


如果您计划最终创建不同的前端(例如,Web UI和WPF或Silverlight UI),那么Web服务就有很多意义,因为它们提供了一个共同的数据基础来构建,并且可以跨层访问。

< P>如果您的数据访问层将所有数据拉为可查询的,然后,您将能够查询您的DAL,并以更高的精度向下钻取您的db调用

请参阅我使用LINQtoSQL编写的关于存储库和服务层的非常简短的介绍。我的文章是围绕MVC构建的,但存储库和服务层的概念在WebForms、WinForms、Web服务等方面可以很好地使用

同样,这里的关键是让您的存储库或Dal返回一个对象
AsQueryable
,这样您就可以等到最后一刻才真正提交请求数据

你的结构会像这样

Domain Layer
    Repository Layer (IQueryable)
        Service layer for Web App
            Website
        Service layer for Desktop App
            Desktop App
        Service layer for Web Services 
            Web Service

在服务层中,您可以根据开发的应用程序自定义特定调用。这允许在每个应用程序的基础上实现更高的安全性和配置,同时维护一个完整的存储库,在您调出您的ORM(如果您决定需要调出您的ORM)之前,不需要修改该存储库。

在这种情况下,拥有比您需要的更多的存储库本身并没有什么错。整个.NET4客户端配置文件包含超过50MB的程序集、类等。在我的整个职业生涯中,我可能会使用其中的5%。这并不意味着如果我需要的话,我不喜欢所有的东西


如果您计划向不应该访问部分数据的开发人员提供DAL,请编写一个包装器或派生一个新的DAL。除非您确信自己能够承担费用,否则我会避开服务路线。

听起来您走的方向是对的。如果许多应用程序要使用这些数据,您可以通过使用DTO服务获得一些优势

  • 如果域模型更改,则只需要更改到DTO的映射。您可以将消费应用程序与这些更改隔离开来
  • 通过网络传输的数据更少
  • 您可以将应用程序与DAL的实现隔离开来
  • 如果有必要限制对象模型的哪些部分应该公开,您可以为不同的应用程序公开不同的服务(可能是不同的DTO)

  • 我部分不同意。如果@Isaac说“数据”远远超过了web服务所需要的。。。那么,当大部分信息都无用时,他不想查询那么多信息是对的。是的.NET框架很大,并且比一般应用程序所需的要多得多。。。但你并不是在每次API调用中都轮询整个50MB的文件,就像你在访问数据库一样。这取决于他所说的“需要的数据太多”的意思。如果预测包含太多数据,那么是的,他会想导出一个新的DAL。如果有不必要的查询,那么在那里进行查询将不会花费任何成本,除非库将由不应该访问无关数据的开发人员使用。是的,非常正确。不必要的查询既不在这里也不在那里。附加数据可能会对性能造成巨大影响。。。取决于当前DAL的结构。我完全同意这一点,但是“repository”链接根本不涉及使您的回购可查询。可查询存储库允许您更好地从多个应用程序构造db调用,而无需重写现有内容。(当然,前提是您愿意对应用程序中的现有db调用进行初始重写)。这就是为什么存储库层与服务层配合得很好。。。为不同的应用程序提供不同的服务。@rock:返回
    IQueryable
    对象的决定将取决于您希望消费者拥有多少控制权。通常,
    IQueryable
    对象将可以访问Linq到SQL对象树中的其他链接对象,并允许对它们执行其他Linq查询。虽然这样通常可以创建一个更薄、功能更强大的存储库层(延迟加载很好),但出于控制和安全原因,这样做并不总是理想的。有时,您只需要一个列表或单个实体对象。是的,这是非常正确的,但是您不能在服务层添加安全性和控制吗?@rock:并不是所有的应用程序都有服务层。但是,是的,可以在那里完成。