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

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

Жанры

Шрифт:

.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);

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

Петр III

Сахаров Андрей Николаевич
12. Романовы. Династия в романах
Проза:
историческая проза
5.00
рейтинг книги
Петр III

Принадлежать им

Зайцева Мария
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Принадлежать им

Город гибели

МакКаммон Роберт Рик
Фантастика:
ужасы и мистика
мистика
7.78
рейтинг книги
Город гибели

Путь Князя. Возрождение. Часть I

Рокотов Алексей
6. Путь князя
Фантастика:
рпг
попаданцы
5.00
рейтинг книги
Путь Князя. Возрождение. Часть I

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Невольничий караван

Май Карл Фридрих
Приключения:
прочие приключения
6.83
рейтинг книги
Невольничий караван

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

Глобальный человейник

Зиновьев Александр Александрович
Документальная литература:
критика
прочая документальная литература
публицистика
6.40
рейтинг книги
Глобальный человейник

Клинок Судеб

Глушков Владислав
Проза:
современная проза
5.75
рейтинг книги
Клинок Судеб

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Шайтан Иван

Студиозус 2

Шмаков Алексей Семенович
4. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
6.25
рейтинг книги
Студиозус 2

Темные тропы и светлые дела

Владимиров Денис
3. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Темные тропы и светлые дела