我的控制器类有以下代码。我从控制器刷新我的视图。每次刷新时,都会调用我的整个类构造函数,我只想刷新我的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();
}
答案 0 :(得分:2)
您不应该在控制器中执行此操作。根据定义,控制器是Web请求的主管。您至少需要一个域类型来创建和释放数据库连接等外部资源,并对数据源进行查询。我甚至无法看到关闭/处置连接的位置。
答案 1 :(得分:1)
如何避免每个请求的控制器实例化?
您可以通过implementing and registering your own controller factory执行此操作,XY problem仅将给定控制器实例化一次,然后将其存储在AppDomain中的某个位置,以使其保持活动的时间长于当前请求,例如在某个静态变量中。
然而,这个问题就像一个.NET uses connection pooling。您似乎关心为每个请求打开数据库连接的相对成本。
好消息,大家好!你不是第一个考虑这个问题的人,你不应该担心,因为框架构建者很久以前就已经解决了这个问题:js audio player。
简而言之,这意味着您不必担心打开数据库连接,因为较早打开的连接将保存在池中并在请求时返回给您的应用程序。