N
NikSoft
В моей предыдущей заметке( Single Instance Application ) было показано как строить приложение, только единичная копия которого находится в памяти в любой момент времени. Продолжим эту же тему по отношению к типу.
Пусть нам нужен централизованный доступ к базе данных, причем необходимо иметь только один обьект класса, реализующий этот доступ. Следующий класс GetInfoFromDB решает задачу.
Ввиду того, что спецификатор доступа конструктора класса – protected, доступ к классу обеспечивается только
через статические методы GetCategories, GetManufacturers,которые являются публичными(public).
При вызове этих методов(как, например, в следующем коде)
происходит обращение к свойству Instance класса. Это свойство проверяет, был ли создан обьект
класса GetInfoFromDB. Если нет, то создается обьект типа GetInfoFromDB, ссылка на который присваивается приватному статическому полю _instance. В любом случае возвращается ссылка только на один и тот же обьект типа GetInfoFromDB.
Пусть нам нужен централизованный доступ к базе данных, причем необходимо иметь только один обьект класса, реализующий этот доступ. Следующий класс GetInfoFromDB решает задачу.
Код:
using System.Data;
using System.Data.SqlClient;
namespace Singleton
{
class GetInfoFromDB
{
static GetInfoFromDB _instance = null;
protected GetInfoFromDB(){ } // the constructor
static GetInfoFromDB Instance
{
get
{
if (_instance == null) _instance = new GetInfoFromDB();
return _instance;
}
}
static SqlConnection Connection
{
get
{
return new SqlConnection("Data Source=(local);Initial Catalog=Costupdate;Integrated Security=True;");
}
}
DataTable GetCategoriesFromDB()
{
DataSet dataSet = new DataSet();
Connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Categories;", Connection);
adapter.Fill(dataSet, "Categories");
Connection.Close();
return dataSet.Tables["Categories"];
}
public static DataTable GetCategories()
{
return Instance.GetCategoriesFromDB();
}
DataTable GetManufacturersFromDB()
{
DataSet dataSet = new DataSet();
Connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Manufacturers;", Connection);
adapter.Fill(dataSet, "Manufacturers");
Connection.Close();
return dataSet.Tables["Manufacturers"];
}
public static DataTable GetManufacturers()
{
return Instance.GetManufacturersFromDB();
}
}
}
Ввиду того, что спецификатор доступа конструктора класса – protected, доступ к классу обеспечивается только
через статические методы GetCategories, GetManufacturers,которые являются публичными(public).
При вызове этих методов(как, например, в следующем коде)
Код:
dataGridView1.DataSource = new DataView(GetInfoFromDB.GetCategories());
dataGridView2.DataSource = new DataView(GetInfoFromDB.GetManufacturers());
происходит обращение к свойству Instance класса. Это свойство проверяет, был ли создан обьект
класса GetInfoFromDB. Если нет, то создается обьект типа GetInfoFromDB, ссылка на который присваивается приватному статическому полю _instance. В любом случае возвращается ссылка только на один и тот же обьект типа GetInfoFromDB.