Linq to Entities - 3层架构

Jul*_*ian 6 c# linq-to-entities dao 3-tier

在过去的几个月里,我学到了很多关于Linq-To-Entities和带有DAO/DAL/Repository的3层架构.现在我脑子里有一些让我烦恼的事情.我将在下面看到这三个问题.

有很多方法可以使存储库工作,但是以何种方式使存储库以性能的方式工作.

1)在构造函数中初始化datacontext

public class Repository : IRepository
{

    private Datacontext context;

    public Repository()
    {
        context = new Datacontext();
    }

    public IList<Entity> GetEntities()
    {
        return (from e in context.Entity
                select e).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

2)使用"使用"

public class Repository : IRepository
{
    public IList<Entity> GetEntities()
    {
        using (Datacontext context = new Datacontext())
        {
            return (from e in context.Entity
                    select e).ToList();
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

3)另一种方式(请评论)

我会在此提出您的建议供其他人发表评论


此外,似乎有些人说存储库应该向业务层返回IQueryable,而其他人则认为返回IList更好.你对此有何看法?


第一个问题中的上述代码示例指向Repository,但是在businesslayer中实现存储库的最佳途径是什么(在构造函数中初始化,使用"Using"??)

Isa*_*ham 2

我认为两者都有效。最重要的是,您应该使对象上下文的寿命相当短(恕我直言)。因此我认为你有两个选择:-

  1. 在单个方法调用中创建/销毁上下文,例如根据第二个示例的 using 语句。

  2. 创建/销毁存储库时创建/销毁上下文 - 在这种情况下,您的存储库应该实现 IDisposable 并将其本身包装在 using 语句中,并且应该是短暂的。这种方法的好处是,您的存储库方法只需执行查询,不会使用 (new ObjectContext()) 污染该方法;另一方面是可重复性传递给客户端来处理存储库。使用此机制意味着您还可以在 IQueryable<> 中编写查询(前提是您在处置存储库之前执行查询)。例如:

公共类存储库:IDisposable { DataHubContext context = new DataHubContext();

public IQueryable<Payment> GetPayments()
{
    return context.Payments;
}

public void Dispose()
{
    context.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

}

格式变得有点有趣 - 抱歉......然后在你的调用代码中: -

public class ClientCode
{
    public void DisplayPaymentsOnScreen()
    {
        Payment[] payments;

        using (var repository = new Repository())
        {
            payments = repository.GetPayments().Where(p => p.Amount > 100).ToArray();
        }

        // Do stuff with the data here...
    }
}
Run Code Online (Sandbox Code Playgroud)