【问题标题】:Pass instance of a class as argument or create new instance every time?将类的实例作为参数传递或每次都创建新实例?
【发布时间】:2014-05-09 21:30:15
【问题描述】:

我总是遇到同样的问题,但我不知道该怎么做... 我在数据库中有很多表,每个表都有很多类,它们管理着每个表(orm)。我还有一个像“路由器”这样的基类控制器,它管理所有的表类。

所以,我的问题是,什么更好?在每个代表表的类中创建数据库连接的实例,还是在路由器类中创建实例并传递它?

选项 1:在每个类中创建新实例。

public class Table1Controller : Table1Mapp
{
    private Database myDatabaseInstance { get; set; }

    public Table1Controller()
    {
        myDatabaseInstance = new Database("Connection String here");
    }
    ...
}

public class Table2Controller : Table2Mapp
{
    private Database myDatabaseInstance { get; set; }

    public Table2Controller()
    {
        myDatabaseInstance = new Database("Connection String here");
    }
    ...
}

public class DatabaseRouterController
{
    private Table1 _table1;
    public Table1 table1
    {
        get { return this._table1 ?? (this._table1 = new Table1()); } 
        private set { this._table1 = value }; 
    }

    private Table2 _table2;
    public Table2 table2
    {
        get { return this._table2 ?? (this._table2 = new Table2()); } 
        private set { this._table2 = value }; 
    }
}

选项 2:只创建一次对象并传递它。

public class Table1Controller : Table1Mapp
{
    private Database myDatabaseInstance;

    public Table1Controller(Database myDatabaseInstance)
    {
        this.myDatabaseInstance = myDatabaseInstance;
    }
    ...
}

public class Table2Controller : Table2Mapp
{
    private Database myDatabaseInstance;

    public Table2Controller(Database myDatabaseInstance)
    {
        this.myDatabaseInstance = myDatabaseInstance;
    }
    ...
}

public class DataBaseInstanceClass
{
    protected Database myDatabaseInstance { get; set; }

    public DataBaseInstanceClass()
    {
        myDatabaseInstance = new Database("Connection String here");
    }
}

public class DatabaseRouterController : DataBaseInstanceClass
{
    private Table1 _table1;
    public Table1 table1
    {
        get { return this._table1 ?? (this._table1 = new Table1(base.myDatabaseInstance)); } 
        private set { this._table1 = value }; 
    }

    private Table2 _table2;
    public Table2 table2
    {
        get { return this._table2 ?? (this._table2 = new Table2(base.myDatabaseInstance)); } 
        private set { this._table2 = value }; 
    }
}

任何进一步的建议将不胜感激...... 提前致谢!

【问题讨论】:

  • 您是否正在构建自己的 ORM
  • 所有这些控制器的目的是什么?
  • 不,我已经映射了我的数据库。实际上我正在使用 PetaPoco。这些控制器用于提供基于模型 MVC 的功能。
  • 一般来说,最好每次都重用同一个类实例,只要这样做不会与类的预期使用方式相矛盾。
  • @JorgeCode 我认为 RepositoryUnit Of Work 模式更适合数据访问场景。

标签: c# class design-patterns instantiation multiple-instances


【解决方案1】:

我要做的是创建一个 DAL(数据访问层),它可以从任何提到的控制器访问,并且简单地将正在针对数据库层完成的工作包装起来,因此您不必费心传递数据库连接。

此外,当您需要访问数据库中的新表或新功能时,它会为您节省大量重构代码的时间。

我建议你查看Repository Pattern

【讨论】:

  • 谢谢我的朋友。似乎存储库模式与我正在寻找的完全匹配。
【解决方案2】:

您应该阅读有关Dependency Injection 模式的信息。它会提倡选项 2,因为它会使您的各种类能够连接到您传入的任何数据库,而不是被锁定到特定的数据库。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2016-10-21
    • 1970-01-01
    • 2013-12-17
    • 2013-06-23
    相关资源
    最近更新 更多