Выбрать главу

  {

    if (orderId == Guid.Empty)

      throw new ArgumentException("orderId");

    return _dataBase.Orders

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

  }

  public IEnumerable<IOrder> GetCustomerOrders(Guid customerId)

  {

    if (customerId == Guid.Empty)

      throw new ArgumentException("customerId");

    return _dataBase.Orders

      .Where(x => x.customerId == customerId)

      .Select<Order, IOrder>(x => x);

  }

}

public class ProductRepository : IProductRepository {

  private readonly MyDatabaseDataContext _dataBase;

  public ProductRepository(MyDatabaseDataContext db)

  {

    if (db == null)

      throw new ArgumentNullException("db");

    _dataBase = db;

  }

  public IProduct GetProductById(Guid productId)

  {

    if (productId == Guid.Empty)

      throw new ArgumentException("productId");

    return _dataBase.Products

      .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 {