5秒后控制器刷新 - 避免构造函数调用

时间:2016-09-07 09:35:09

标签: c# asp.net-mvc

我的控制器类有以下代码。我从控制器刷新我的视图。每次刷新时,都会调用我的整个类构造函数,我只想刷新我的Show函数及其附加的View。 如何避免每次调用此构造函数。

public class DriverController : Controller
{
    OdbcConnection DBConnection; //= new OdbcConnection("DSN=pitbuccx");
    OdbcConnection DBConnection2; // = new OdbcConnection("DSN=pitbuccx2");
    Query q;
    string myQuery;
    OdbcCommand cmd;
    OdbcCommand cmd2;
    OdbcDataReader DbReader;
    OdbcDataReader DbReader2;

    string LoggedInAgents;   
    string OnCalls;              
    string AgentsInReadyState;   
    string AgentsInNotReadyState;
    string AgentsInWrapup;       
    string ReservedAgents;       
    string CallsOffered;         
    string CallsAnswered;        
    string CallsAbandoned;       
    string CallsInQueue;         
    string LongestCallInQueue;   
    string AbandRate;            
    string ServiceLevelPct;      
    string ASA;                  
    string AHT;
    string LongestTalkDuration;  

    public DriverController()
    {
        OdbcConnection DBConnection = new OdbcConnection("DSN=pitbuccx01");
        DBConnection.Open();
        OdbcConnection DBConnection2 = new OdbcConnection("DSN=pitbuccx02");
        DBConnection2.Open();
        q = new Query();
        myQuery = q.getQuery();

        cmd = DBConnection.CreateCommand();
        cmd2 = DBConnection2.CreateCommand();
        cmd.CommandText = myQuery;
        cmd2.CommandText = myQuery;

        Console.WriteLine("This is Constructor");
    }

    public ActionResult Show()
    {
        DbReader = cmd.ExecuteReader();
        DbReader2 = cmd2.ExecuteReader();
        DbReader.Read();
        DbReader2.Read();

        string testData1;
        string testData2;
        //Checking Connection Data Validity.
        testData1 = DbReader["A"].ToString();
        testData2 = DbReader2["B"].ToString();

        Response.AddHeader("Refresh", "5");
        return View();
    }
}

 ~DriverController()
    {

        DbReader.Close();
        cmd.Dispose();
        DBConnection.Close();

        DbReader2.Close();
        cmd2.Dispose();
        DBConnection2.Close();
    }

2 个答案:

答案 0 :(得分:2)

您不应该在控制器中执行此操作。根据定义,控制器是Web请求的主管。您至少需要一个域类型来创建和释放数据库连接等外部资源,并对数据源进行查询。我甚至无法看到关闭/处置连接的位置。

答案 1 :(得分:1)

  

如何避免每个请求的控制器实例化?

您可以通过implementing and registering your own controller factory执行此操作,XY problem仅将给定控制器实例化一次,然后将其存储在AppDomain中的某个位置,以使其保持活动的时间长于当前请求,例如在某个静态变量中。

然而,这个问题就像一个.NET uses connection pooling。您似乎关心为每个请求打开数据库连接的相对成本。

好消息,大家好!你不是第一个考虑这个问题的人,你不应该担心,因为框架构建者很久以前就已经解决了这个问题:js audio player

简而言之,这意味着您不必担心打开数据库连接,因为较早打开的连接将保存在池中并在请求时返回给您的应用程序。