将类的实例作为参数传递或每次创建新实例?

时间:2014-05-09 21:30:16

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

我总是遇到同样的问题而且我不知道什么是最好的... 我在数据库中有很多表,每个表都有很多类来管理每个表(orm)。我还有一个基类控制器,如" router"这是管理所有表格的。

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

选项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 }; 
    }
}

Opcion 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 }; 
    }
}

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

2 个答案:

答案 0 :(得分:1)

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

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

我建议您查看Repository Pattern

答案 1 :(得分:1)

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