首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >3层体系结构中的LINQ to SQL

3层体系结构中的LINQ to SQL
EN

Stack Overflow用户
提问于 2009-06-19 06:02:17
回答 7查看 3.1K关注 0票数 4

我目前使用的是三层架构(DAL、BLL、表示层)。

我想知道如何使用LINQ to SQL实现3层架构。我不知道LINQ应该是DAL还是BLL。LiNQ似乎是DAL和BLL的融合。

以前有人在3层架构中实现过LINQ吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-06-19 06:42:29

我使用Linq- to -SQL/XML,我认为我的应用程序是三层的。Linq之前的应用程序的不同之处在于,现在的数据访问层更小、更轻,这实际上是一件非常好的事情!

在我的旧DAL中,我会有这样的方法:

代码语言:javascript
运行
复制
public virtual int CountCustomersInCountry(string country) {
    // Plug in raw SQL.
}

public virtual List<Customer> GetCustomersInCountry(string country) {
    // Plug in raw SQL.
}

public virtual int CountCustomersForDepartment(string department) {
    // Plug in raw SQL.
}

public virtual List<Customer> GetCustomersForDepartment(string department) {
    // Plug in raw SQL.
}

etc. etc. ad-infinitum

我现在有以下几种方法:

代码语言:javascript
运行
复制
public virtual int Count(Expression<Func<T, bool>> where) {
    // Plug in Linq-to-SQL DataContext here.        
}

public virtual T Get(Expression<Func<T, bool>> where) {
     // Plug in Linq-to-SQL DataContext here.   
}

public virtual List<T> Get(Expression<Func<T, bool>> where,  string orderByField, int offset, int count) {
    // Plug in Linq-to-SQL DataContext here.   
}

为了调用新的DAL方法,并在DynamicLinq的帮助下,我使用:

代码语言:javascript
运行
复制
int countryCount = Count(c => c.Country == country);
List<Customer> customers = Get(c => c.Country == country, "inserted", 0, 25);
int departmentCount = Count(c => c.Department == department);
List<Customer> customers = Get(c => c.Department == department, "inserted", 0, 25);

所有这些都是在你开始使用Linq2SQL进行添加、更新和删除之前,它们变成了单行调用!我的DAL现在由10个方法组成,像以前一样,对于我的DAL正在处理的每个对象,可以很容易地获得多达20到30个方法!我强烈建议你试着理解它,因为它真的会节省你大量的代码。

票数 6
EN

Stack Overflow用户

发布于 2009-06-19 08:00:35

LINQ-to-SQL实际上主要是关于DAL的-它是一种数据访问技术。然而,在一个足够简单的应用程序中,没有什么可以阻止您将LINQ创建的对象传递到业务层,甚至将它们绑定到您的UI。为什么不行?

但是,您需要注意,在这种情况下,您会将自己与LINQ- to -SQL捆绑在一起。如果这对你的场景来说没问题--很好,使用它吧!这是一个你需要根据你的项目需要自己做出的设计决定。

如果系统变得更加复杂,特别是当从数据库表创建的LINQ对象与业务对象不是一对一匹配时,您可以始终使用业务层从LINQ对象“组装”实际的业务对象。在像AutoMapper这样的工具的帮助下,您甚至可以编写大量左右赋值的“猴子”代码:-)

另一方面,如果您处于这种情况下,您可能还希望查看ADO.NET实体框架,而不是LINQ SQL。EF为你提供了许多这些更高级的功能,这些功能对于一个小应用程序来说可能会被夸大,但对于一个企业应用程序来说可能是绝对至关重要的。例如支持多个数据库供应商,将业务对象映射到数据库中的不同物理表示,等等。

Marc

票数 3
EN

Stack Overflow用户

发布于 2009-06-19 06:22:00

LiNQ创建的对象通常被描述为业务层对象,尽管它们确实需要与数据层进行比通常建议的更高的耦合。但是,如果您有比LiNQ中直接表示的结构更高级别的结构,那么额外的控制器可以作为业务层进行操作,而LiNQ更像是一个数据层。

它实际上取决于数据库中表示的对象的范围,以及您希望实现的耦合级别。因为LiNQ侧重于queryables,所以它可能会过度渗透到应用程序中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1016525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档