Для доступа к данным, находящимся в БД, подготовим группу классов. Классы доступа к БД, извлечения данных и упаковки их в объектное представление разделены на так называемые "слой доступа к данным" (Data Access Layer - DAL) и "слой бизнес - логики" (Business Logic Layer - BLL) . На диаграмме показаны взаимоотношения слоев:
Рассмотрим слой DAL:
Его задача - это подключение к БД, извлечение данных и передача их наверх. Не особо заботясь ни о том кто инициировал его работу, ни что произойдет с извлеченными данными далее, слой DAL просто подключается к БД и получает информацию. При проектировании DAL создается абстрактный базовый класс BaseDal:
using System;
using System.Data;
using System.Data.Common;
namespace Paging
{
/// <summary>
/// Класс для реализации всех общих задач приложения
/// </summary>
public abstract class BaseDal
{
//строка подключения к БД
public BaseDal()
{
OracleConnectionString = String.Empty;
}
protected string OracleConnectionString { get; set; }
//Для обновления
protected int ExecuteNonQuery(DbCommand cmd)
{
return cmd.ExecuteNonQuery();
}
//Для выборки данных
protected IDataReader ExecuteReader(DbCommand cmd, CommandBehavior behavior)
{
return cmd.ExecuteReader(behavior);
}
protected IDataReader ExecuteReader(DbCommand cmd)
{
return ExecuteReader(cmd, CommandBehavior.Default);
}
protected object ExecuteScalar(DbCommand cmd)
{
return cmd.ExecuteScalar();
}
}
}
В этом классе представлено свойство OracleConnectionString и методы - упаковщики базовых методов объекта DbCommand, который может быть и OracleCommand и SqlCommand. таким образом в этом классе реализованы методы ExecuteNonQuery,ExecuteReader,ExecuteScalar осуществляющие конкретные действия, при чем даже про тип БД разговор пока не ведется.
Далее создадим класс - наследник BaseDal:
using System;
using System.Collections.Generic;
using System.Web.Configuration;
using System.Data;
namespace Paging
{
/// <summary>
/// Сводное описание для OracleProvider
/// </summary>
public abstract class JobsProvider: BaseDal
{
private static JobsProvider _instance;
public static JobsProvider Instance
{
get {
if(_instance == null)
{
_instance = (JobsProvider)Activator.CreateInstance(Type.GetType(TestSection.Section.Jobs.ProviderType));
return _instance;
}
return _instance;
}
}
protected JobsProvider()
{
//ссылка на web.config извлекаем строку
OracleConnectionString = WebConfigurationManager.ConnectionStrings["LocalOracleServer"].ConnectionString;
}
protected JobDetails GetJobFromReader(IDataReader reader)
{
var job = new JobDetails(
Convert.ToInt32(reader["JOBID"]),
reader["JOBNM"].ToString());
return job;
}
protected List<JobDetails> GetJobListFromReader(IDataReader reader)
{
var jobsArr = new List<JobDetails>();
while (reader.Read())
{
jobsArr.Add(GetJobFromReader(reader));
}
return jobsArr;
}
//оболочки SQL команд
public abstract List<JobDetails> GetJobs();
public abstract JobDetails GetJobById(Int32 jobId);
}
}
Класс JobsProvider несколько конкретизирует направление, которым необходимо заниматься при извлечении данных. Он имеет ссылки на два вспомогательных класса: TestSection и JobDetails. Первый наследуется от ConfigurationSection и является своеобразным упаковщиком настроек, которые должны содержаться в web.config. JobDetails -обыкновенный класс - обертка для полей таблицы Jobs. На обоих этих классах остановимся позднее и я приведу их полное содержимое. А пока остановимся на содержимом класса JobsProvider:
В нем реализовано свойство Instance, т. е. экземпляр класса, который с помощью Type.GetType()
в момент исполнения кода указывает на провайдер данных, указанный в TestSection. Это реализовано для того чтобы ослабить связь между BLL слоем и DAL слоем и исключить создание DAL объектов в BLL слое.
protected JobDetails GetJobFromReader(IDataReader reader) - этот метод "упаковывает" извлеченную из БД строку данных в объект класса JobDetails.
protected List<JobDetails> GetJobListFromReader - укладывает упакованные объекты в список. тут, я думаю, понятно.
В следующей статье приведу код классов JobDetails и TestSection, чтоб стало понятнее, откуда что берется, а затем рассмотрим класс - поставщик данных.
Комментариев нет:
Отправить комментарий