它可能是一个简单的3层问题。我只想确保我们为此使用最佳实践,而我还不是那样的结构。

我们有3层:

  • GUI:ASP.NET用于演示层(第一个平台)
  • BAL:业务层将在C#中的Web服务器上处理逻辑,因此我们俩都可以将其用于WebForms/MVC + WebServices
  • DAL:Linq到数据层中的SQL,返回BusinessObjects而不是Linq。
  • DB:SQL将是Microsoft SQL-Server/Express(尚未决定)。

让我们考虑一下设置,其中有一个[人]的数据库。他们都可以拥有多个[地址] ES,我们有一个完整的[邮政编码]和相应的Citynames等。

交易是我们从其他表中加入了许多细节。

{关系}/[表

  • person]:1 --- n:{personaddress}:m --- 1:[地址
  • 地址]:n --- 1:[邮政编码

现在,我们想为人建造DAL。人员应该看起来如何,何时发生连接?获取所有城市名称和可能的地址PR是业务层问题吗?人?还是DAL应该在将Personbo返回BAL之前完成所有这些?

Class PersonBO 
{
    public int ID {get;set;}
    public string Name {get;set;}
    public List<AddressBO> {get;set;} // Question #1
} 

// Q1:我们是否在返回人员之前检索对象,应该是数组吗?还是对于N层/3层完全错误?

Class AddressBO 
{
    public int ID {get;set;}
    public string StreetName {get;set;}
    public int PostalCode {get;set;} // Question #2
} 

// Q2:我们是进行查找还是仅离开邮政编码以供以后查找?

谁能解释什么顺序拉出哪些对象?建设性的批评非常受欢迎。 :o)

有帮助吗?

解决方案

您有点重新发明了轮子。 ORMS已经为您解决了大部分问题,并且您会发现自己有点棘手。

诸如Linq到SQL之类的ORMS,实体框架和NHIBERNATE的方式是一种称为的技术 懒负荷 关联(可以选择以急切的负载为止)。

当你拉起 Person, ,不加载 Address 在您特别要求它之前,在这一点上,发生了另一个往返数据库(懒负载)。您也可以按照您想要的 Address 加载 每一个 人(急切的负载)。

从某种意义上说,有了这个问题,您基本上询问您是否应该执行懒惰或急切的负担 AddressBO 为了 PersonBO, ,答案是:都不。没有一种普遍起作用的方法。 默认 您可能应该懒惰的负载,这样您就不会做很多不必要的加入;为了实现这一目标,您必须建立 PersonBO 使用懒惰的机制,可以维持对DAL的一些参考。但是您仍然需要选择急切的负载,您需要在“业务访问”逻辑中构建。

另一个选项,如果您需要返回具有从许多不同表中填充的特定属性的高度定制数据集,则不要返回 PersonBO 完全,但是使用 数据传输对象 (DTO)。如果您实现默认的懒惰机制,则有时可以将其替换为急切的加载版本。


仅供参考,数据访问框架中的懒惰装载机通常是通过关联本身的加载逻辑构建的:

public class PersonBO
{
    public int ID { get; set; }
    public string Name { get; set; }
    public IList<AddressBO> Addresses { get; set; }
}

这只是一个poco,魔术发生在实际列表实现中:

// NOT A PRODUCTION-READY IMPLEMENTATION - DO NOT USE

internal class LazyLoadList<T> : IList<T>
{
    private IQueryable<T> query;
    private List<T> items;

    public LazyLoadList(IQueryable<T> query)
    {
        if (query == null)
            throw new ArgumentNullException("query");
        this.query = query;
    }

    private void Materialize()
    {
        if (items == null)
            items = query.ToList();
    }

    public void Add(T item)
    {
        Materialize();
        items.Add(item);
    }

    // Etc.
}

(显然,这不是生产级,而是仅仅是为了演示该技术;您从查询开始,直到您必须在需要之前实现实际列表。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top