gpt4 book ai didi

asp.net - LINQ to SQL Web 应用程序最佳实践

转载 作者:行者123 更新时间:2023-12-03 21:49:14 24 4
gpt4 key购买 nike

在我构建 Web 应用程序的经验中,我一直使用 n 层方法。从数据库获取数据并填充对象的 DAL,从 DAL 获取对象并对其执行所需的任何业务逻辑的 BLL,以及从 BLL 获取它的显示数据的网站。
我最近开始学习 LINQ,大多数示例都显示了从 Web 应用程序代码隐藏中发生的查询(可能我只看到了过于简化的示例)。在 n 层架构中,这总是被视为一个很大的禁忌。
我有点不确定如何构建一个新的 Web 应用程序。我一直在使用 VS2008 中的服务器资源管理器和 dbml 设计器来创建 dbml 和对象关系。我似乎有点不清楚 dbml 是否会被视为 DAL 层,网站是否应该调用 BLL 中的方法,然后执行 LINQ 查询等。
有哪些通用架构最佳实践或使用 LINQ to SQL 创建 Web 应用程序解决方案的方法?

最佳答案

恐怕你确实见过过于简化的例子。 LINQ to SQL (System.Data.Linq) 是您的 DAL 层。 L2S 生成的类是您的域(但不要与 Domain-Driven Design 混淆)。最重要的是,您仍然可以编写业务层。

我总是试图防止泄漏 LINQ to SQL DataContext进入表示层(您的 Web 应用程序)。所以它不应该能够创建或提交 DataContext .你也不应该返回 IQueryable<T>对象到表示层。 IMO 业务层应该完全控制 DataContext 的生命周期(工作单元)和 SQL 查询的形状。

然而,有几种口味。有些人搭帐篷来放松这些限制。其他人甚至走得更远。这取决于您自己的口味和应用程序的大小。应用程序越大,添加抽象层就越合理。

禁止时 IQueryable s 和其他与离开业务层的数据相关的东西,你最终会遇到一些有趣的挑战。例如,表示层必须指示业务层如何对结果进行排序。虽然您可以让表示层自己对结果进行排序,但这意味着您必须从表示层的数据库和页面中获取所有数据,这会导致系统性能非常差。这个问题有几种解决方案。在所有情况下,您都需要通知业务层如何为您排序结果。当您搜索 LINQ dynamic sort 时,可以在 SO 中找到解决方案。 .我自己写过这样的解决方案,here .

另一个挑战是不允许 IQueryable离开你的 BL 会带来的是,域对象通常也不能离开你的 BL。大多数 LINQ to SQL 域对象将包含延迟加载的属性(例如,其他域对象的集合)。然而,当DataContext由业务层控制,它将在您将结果返回到表示层之前被处理掉。当演示文稿访问延迟加载的属性时,会发生异常,因为 DataContext已经被处置。当您处置 DataContext在您的业务层,这种行为当然是“设计使然”。允许表示层获得延迟加载的属性意味着 BL 失去了对发送到数据库的查询的控制,从而失去了对性能的控制。

要解决此问题,您应该将数据传输对象 (DTO) 从 BL 返回到表示层。 DTO 将只包含数据而不包含内部 DataContext ,并且没有延迟加载的属性。 DTO 可以针对手头的实际请求进行特殊格式化。 DTO 本身当然会导致编码开销,因此您的系统大小和性能需求必须证明它是合理的。为了方便我自己,我倾向于将静态投影方法放在 DTO 上。虽然这不符合 separation of concerns原则上,我发现这是一个非常实用的解决方案。以这个 CustomerDTO 为例:

public class CustomerDTO
{
public int CustomerId { get; set; }
public string Name { get; set; }
// City is flatterned from Address.City.
public string City { get; set; }

internal static IQueryable<CustomerDTO> AsDTO(IQueryable<Customer> customers)
{
return
from customer in customers
select new CustomerDTO()
{
CustomerId = customer.Id,
Name = customer.Name,
City = customer.Address.City
};
}
}

这个 DTO 定义了一个内部 AsDTO方法,该方法能够转换 Customer 的集合域对象到 CustomerDTO 的集合DTO。这使得域对象到 DTO 的转换更加容易。看看这个 BL 方法的例子:
public static CustomerDTO[] GetCustomersByCountry(string country)
{
using (var db = ContextFactory.CreateContext())
{
IQueryable<Customer> customers =
(from customer in db.Customers
where customer.Address.Country == country
orderby customer.Name, customer.Id);

return CustomerDTO.AsDTO(customers).ToArray();
}
}

这种方法的好处在于,当您查看 SQL 查询时,您将看到只会从数据库中检索客户 ID、名称和地址表的城市。这是因为 AsDTO方法翻译一 IQueryable另一个,允许 LINQ to SQL 执行数据库中的全部操作。

我希望这能给你一些关于你能做什么的想法。当然,这是我对这个主题的看法以及我在我的情况下发现的实际情况。

关于asp.net - LINQ to SQL Web 应用程序最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2785506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com