Я написал класс следующим образом. Я написал его с учетом того, что он в основном предназначен для использования в Интернете (т.е. он будет использоваться со страниц aspx).
public class TestHelper
{
public TestHelper()
{
HttpContext ctxt = HttpContext.Current;
IHttpHandler RequestHandler = ctxt.Handler;
Page CurrentPage;
CurrentPage = (Page)RequestHandler;
CurrentPage.Unload += new EventHandler(CurrentPage_Unload);
Debug.Print("Open all connection here...");
}
void CurrentPage_Unload(object sender, EventArgs e)
{
Debug.Print("Close all connection here...");
}
}
И я написал код своей страницы aspx следующим образом:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
TestHelper helper = new TestHelper();
helper = null;
}
}
Несмотря на то, что помощнику присвоено значение «null», я обнаружил, что CurrentPage_Unload()
выполняется. Почему такое поведение? Как обычно называется такое поведение?
Причина, по которой я написал класс в этом стиле, заключалась в том, что я думал, что смогу лучше всего управлять своими подключениями к базе данных централизованно в классе. Обычно люди вызывают методы для объекта, такие как helper.IsValid()
, за которыми следует helper.ProfileExists()
в коде aspx позади. Каждый из этих методов будет иметь свои собственные объекты соединения с БД (IDbConnection) и соответствующие им вызовы Open()
и Close()
для открытия/закрытия соединения с БД. Я просто чувствовал, что мы должны сделать это только один раз в коде. Поэтому я использовал конструктор для открытия соединений с БД и событие unload объекта Page для закрытия объектов соединения. Есть ли какие-то подводные камни в написании уроков таким образом?