我应该每次创建一个新对象还是创建一个对象?

时间:2011-01-07 00:16:20

标签: asp.net-mvc instantiation

我使用的是asp.net mvc和实体框架。我们有数据访问层和业务层。现在,由于数据访问完成了所有查询,我需要在业务层类中创建一个dataccess对象。现在我不确定我是应该只创建一个对象还是每次都在本地实例化它。这是一个例子 -

第一种方式 -

class Employee_Business
{
    public Employees GetEmployee()
    {
        DataAccess dao= new DataAccess();
        return dao.GetEmployees();
    }

    public Employee GetEmployee(int id)
    {
        DataAccess dao= new DataAccess();
        return dao.GetEmployee(id);
    }
}

第二种方式 -

class Employee_Business
{
    DataAccess dao;
    public Employee_Business()
    {
        dao = new DataAccess()
    }

    public Employees GetEmployee()
    {
        return dao.GetEmployees();
    }

    public Employee GetEmployee(int id)
    {
        return dao.GetEmployee(id);
    }
}

另一个选择是我可以在DataAccess层中使一些方法静态。在那种情况下,将没有实例化。但我不知道它可能引起的问题。我也听说过Singleton Pattern,但不知道在这么简单的场景中是否真的需要它。我只想知道这种情况下的最佳做法。我相信每个人都这样做,请赐教,谢谢!

4 个答案:

答案 0 :(得分:1)

如果我是你,我会认真阅读工作单元模式。这应该相当彻底地处理你的问题:

Patterns of Enterprise Application Architecture: Unit of Work

它真正归结为您通过数据访问层执行的每组操作都应该是单个工作单元的一部分。该工作单元将所有操作联系在一起,并确保一切都同步。

.NET中有大量使用Entity Framework的工作单元模式的示例,您应该能够根据自己的需要进行调整。

答案 1 :(得分:1)

您需要考虑Web应用程序的工作方式。您的应用程序将很可能同时处理多个请求,如果是这样,您需要考虑如何使用您的课程:

  1. 如果该类正在执行只读操作,您可以将其用作静态实例,而无需担心线程管理。
  2. 如果该类正在执行可以更改其内部状态 write 操作,那么您需要确保它是静态的,它具有互斥锁/监视器/锁定在适当的地方确保原子操作得到满足。
  3. 如果该类正在执行操作更改其内部状态,则可以将其用作静态实例,而无需担心线程管理。
  4. 设计类型时,考虑这些方案很有用。

答案 2 :(得分:1)

每个请求都需要它自己与数据库的连接,因为Web应用程序是多线程的。多个请求可以同时在不同的线程中运行,每个线程都需要它自己与数据库的连接。

(嗯,线程实际上可以共享一个连接,但这将是非常有限的,并且代码更复杂。)

为每个请求创建一个新的对象实例只是最简单的解决方案。可以使用单例类或静态方法,但是您必须管理连接,以便每个请求仍然使用它自己的连接。

答案 3 :(得分:1)

从您提供的两个列表中,您应该使用第二个列表。您不需要为每个查询建立新的连接(或上下文)(如果您在请求中多次查询),但您应为每个请求创建一个Employee_Business类的新实例。 (所以;连接没有单身人士......)