我目前使用的是三层架构(DAL、BLL、表示层)。
我想知道如何使用LINQ to SQL实现3层架构。我不知道LINQ应该是DAL还是BLL。LiNQ似乎是DAL和BLL的融合。
以前有人在3层架构中实现过LINQ吗?
发布于 2009-06-19 06:42:29
我使用Linq- to -SQL/XML,我认为我的应用程序是三层的。Linq之前的应用程序的不同之处在于,现在的数据访问层更小、更轻,这实际上是一件非常好的事情!
在我的旧DAL中,我会有这样的方法:
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我现在有以下几种方法:
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的帮助下,我使用:
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个方法!我强烈建议你试着理解它,因为它真的会节省你大量的代码。
发布于 2009-06-19 08:00:35
LINQ-to-SQL实际上主要是关于DAL的-它是一种数据访问技术。然而,在一个足够简单的应用程序中,没有什么可以阻止您将LINQ创建的对象传递到业务层,甚至将它们绑定到您的UI。为什么不行?
但是,您需要注意,在这种情况下,您会将自己与LINQ- to -SQL捆绑在一起。如果这对你的场景来说没问题--很好,使用它吧!这是一个你需要根据你的项目需要自己做出的设计决定。
如果系统变得更加复杂,特别是当从数据库表创建的LINQ对象与业务对象不是一对一匹配时,您可以始终使用业务层从LINQ对象“组装”实际的业务对象。在像AutoMapper这样的工具的帮助下,您甚至可以编写大量左右赋值的“猴子”代码:-)
另一方面,如果您处于这种情况下,您可能还希望查看ADO.NET实体框架,而不是LINQ SQL。EF为你提供了许多这些更高级的功能,这些功能对于一个小应用程序来说可能会被夸大,但对于一个企业应用程序来说可能是绝对至关重要的。例如支持多个数据库供应商,将业务对象映射到数据库中的不同物理表示,等等。
Marc
发布于 2009-06-19 06:22:00
LiNQ创建的对象通常被描述为业务层对象,尽管它们确实需要与数据层进行比通常建议的更高的耦合。但是,如果您有比LiNQ中直接表示的结构更高级别的结构,那么额外的控制器可以作为业务层进行操作,而LiNQ更像是一个数据层。
它实际上取决于数据库中表示的对象的范围,以及您希望实现的耦合级别。因为LiNQ侧重于queryables,所以它可能会过度渗透到应用程序中。
https://stackoverflow.com/questions/1016525
复制相似问题