Чтение онлайн

на главную - закладки

Жанры

Шрифт:

.SingleOrDefault(x => x.productId == productId);

}

public IEnumerable<IProduct> GetAvailableProducts

{

return _dataBase.Products.Where(x => x.isAvailable)

.Select<Product, IProduct>(x => x);

}

public IEnumerable<IProduct> GetProductListByName(string name)

{

if (string.IsNullOrEmpty(name))

throw new ArgumentException("name");

return _dataBase.Products

.Where(x => x.name.Contains(name))

.Select<Product, IProduct>(x => x);

}

}

Далее

создадим сервисы, которые будут помогать нам манипулировать данными. Сначала определим интерфейсы сервисов:

public interface ICustomerService {

ICustomer Create(string name, string phone, string address);

void Delete(ICustomer customer);

void Update(ICustomer customer, string name,

string phone, string address);

}

public interface IOrderService {

IOrder Create(ICustomer customer, IProduct product, int count,

DateTime orderDateTime);

void Delete(IOrder order);

void Update(IOrder order, ICustomer customer,

IProduct product, int count, DateTime orderDateTime);

}

public interface IProductService {

IProduct Create(string name, bool isAvailable, decimal cost);

void Delete(IProduct product);

void Update(IProduct product, string name,

bool isAvailable, decimal cost);

Реализуем интерфейсы сервисов, как показано в листинге 3.4, для класса customerService. Чтобы уменьшить количество кода, приводить реализацию для других классов мы не будем, для остальных классов определяем методы Create, Delete и Update точно таким же образом.

Листинг 3.4. Реализация интерфейсов сервисов

public class CustomerService : ICustomerService {

private readonly MyDatabaseDataContext _database;

public CustomerService(MyDatabaseDataContext db)

{

if (db == null)

throw new ArgumentNullException("db");

_database = db;

}

public ICustomer Create(string name, string phone, string address)

{

if (String.IsNullOrEmpty(name))

throw new ArgumentNullException("name");

Customer customer = new Customer

{

CustomerId = Guid.NewGuid,

Address = address,

Phone = phone,

Name = name

};

_database.Customers.InsertOnSubmit(customer);

return customer;

}

public void Delete(ICustomer customer)

{

if (customer == null)

throw new ArgumentNullException("customer");

_database.Customers.DeleteOnSubmit((Customer)customer);

}

public void Update(ICustomer customer, string name,

string phone, string address)

{

if (customer == null)

throw new ArgumentNullException("customer");

if (String.IsNullOrEmpty(name))

throw new ArgumentNullException("name");

customer.Name = name;

customer.Phone = phone;

customer.Address = address;

}

}

Нетрудно

заметить, что наш код зависит от определенного типа контекста данных. Следовательно, при использовании этого кода мы вынуждены будем передавать созданный контекст базы данных, а следовательно, будем привязаны к нему. Для того чтобы избавиться от этой зависимости, создадим новый элемент, который будет возвращать необходимый нам контекст базы данных.

public class UnitOfWork : IDisposable {

private readonly MyDatabaseDataContext _database;

public MyDatabaseDataContext DataContext {

get

{

return _database;

}

}

private bool _disposed;

public UnitOfWork

{

_database = new MyDatabaseDataContext;

}

public void Commit

{

_database.SubmitChanges;

}

public void Dispose

{

Dispose(true); GC.SuppressFinalize(this);

}

private void Dispose(bool disposing) {

if (!this._disposed)

{

if (disposing)

{

_database.Dispose;

}

_disposed = true;

}

}

}

Этот класс реализует паттерн UnitOfWork, который описывает реализацию атомарного действия, в данном случае создание контекста базы ORM, использование, сохранение изменений и разрушение объекта.

Пример использования слоя данных

Наша инъекция кода полностью реализована, рассмотрим вариант использования:

using (UnitOfWork unitOfWork = new UnitOfWork)

{

ICustomerService customerService = new

CustomerService(unitOfWork.DataContext);

IOrderService orderService = new

OrderService(unitOfWork.DataContext);

IProductService productService = new

ProductService(unitOfWork.DataContext);

Поделиться:
Популярные книги

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Первый президент. Повесть о Михаиле Калинине

Успенский Владимир Дмитриевич
Пламенные революционеры
Проза:
историческая проза
5.00
рейтинг книги
Первый президент. Повесть о Михаиле Калинине

Русские горки. Конец Российского государства

Калюжный Дмитрий Витальевич
Великие противостояния
Научно-образовательная:
история
политика
6.00
рейтинг книги
Русские горки. Конец Российского государства

В. И. Ленин и ВЧК. Сборник документов (1917–1922)

Ленин Владимир Ильич
Документальная литература:
прочая документальная литература
6.25
рейтинг книги
В. И. Ленин и ВЧК. Сборник документов (1917–1922)

Исцеляющая любовь

Сигал Эрик
История любви
Проза:
современная проза
8.19
рейтинг книги
Исцеляющая любовь

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Сочинения в 2 т. Том 1

Северов Петр Федорович
Проза:
советская классическая проза
5.00
рейтинг книги
Сочинения в 2 т. Том 1

Англо-русский и русско-английский словарь ПК

Мизинина Ирина
Справочная литература:
словари
6.30
рейтинг книги
Англо-русский и русско-английский словарь ПК

Библия. Синодальный перевод

Священное Писание
Религия и эзотерика:
религия
5.00
рейтинг книги
Библия. Синодальный перевод

Собрание сочинений в 10 томах. Том 6

Хаггард Генри Райдер
6. Собрание сочинений в 10 томах
Приключения:
исторические приключения
6.25
рейтинг книги
Собрание сочинений в 10 томах. Том 6

Николай II (Том II)

Сахаров Андрей Николаевич
21. Романовы. Династия в романах
Проза:
историческая проза
5.20
рейтинг книги
Николай II (Том II)

Дневники св. Николая Японского. Том V

Японский Николай
Религия и эзотерика:
православие
христианство
религия
5.00
рейтинг книги
Дневники св. Николая Японского. Том V

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.67
рейтинг книги
Паладин из прошлого тысячелетия

Колодезь

Логинов Святослав Владимирович
Фантастика:
фэнтези
7.50
рейтинг книги
Колодезь