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

Листинг 3.2. Частичные классы с реализацией интерфейсов

public partial class Customer : ICustomer {

  public Guid CustomerId {

    get { return customerId; }

    set { customerId = value; }

  }

  public string Name {

    get { return name; }

    set { name = value; }

  }

  public string Phone {

    get { return phone; }

    set { phone = value; }

  }

  public string Address {

    get { return address; }

    set { address = value; }

  }

}

public partial class Order : IOrder {

  public Guid OrderId {

    get { return orderId; }

    set { orderld = value; }

  }

  public Guid Customerld {

    get { return customerId; }

    set { customerId = value; }

  }

  public Guid ProductId {

    get { return productId; }

    set { productId = value; }

  }

  public int Count {

    get { return count; }

    set { count = value; }

  }

  public DateTime OrderDateTime {

    get { return orderDateTime; }

    set { orderDateTime = value; }

  }

}

public partial class Product : IProduct {

  public Guid ProductId {

    get { return productId; }

    set { productId = value; }

  }

  public string Name {

    get { return name; }

    set { name = value; }

  }

  public bool IsAvailable {

    get { return isAvailable; }

    set { isAvailable = value; }

  }

  public decimal Cost {

    get { return cost; }

    set { cost = value; }

  }

}

На этом этапе существует еще одна полезная возможность, которую предлагает инъекция дополнительного кода: вы можете назначать имена для свойств интерфейса, не привязываясь к именам, которые определены в базе данных. Скажем, для поля cost таблицы Products мы могли бы задать другое название, например, ProductCost.

После реализации интерфейсов создадим простейшие хранилища и сервисы, для этого сначала объявим их интерфейсы:

public interface ICustomerRepository {

  ICustomer GetCustomerById(Guid customerId);

  IEnumerable<ICustomer> GetCustomersByProduct(Guid productId);

}

Хранилище для заказчиков позволит выбирать заказчика по идентификатору и выбирать всех заказчиков, связанных с определенным товаром.

public interface IOrderRepository {

  IOrder GetOrderById(Guid orderId);

  IEnumerable<IOrder> GetCustomerOrders(Guid customerId);

}

Хранилище для заказов позволит выбирать заказ по идентификатору и список заказов определенного заказчика.

public interface IProductRepository {

  IProduct GetProductById(Guid productId);

  IEnumerable<IProduct> GetAvailableProducts();

  IEnumerable<IProduct> GetProductListByName(string name);

}

Хранилище для товаров позволит найти товар по идентификатору, список товаров по наименованию и список товаров, которые доступны в данный момент.

Реализация данных хранилищ не составляет труда (листинг 3.3).

Листинг 3.3. Реализация хранилищ

public class CustomerRepository : ICustomerRepository {

  private readonly MyDatabaseDataContext _dataBase;

  public CustomerRepository(MyDatabaseDataContext db)

  {

    if (db == null)

      throw new ArgumentNullException("db");

    _dataBase = db;

  }

  public ICustomer GetCustomerById(Guid customerId)

  {

    if (customerId == Guid.Empty)

      throw new ArgumentException("customerId");

    return _dataBase.Customers

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

  }

  public IEnumerable<ICustomer> GetCustomersByProduct(Guid productId) {

    if (productId == Guid.Empty)

      throw new ArgumentException("customerId");

    return _dataBase.Orders

      .Where(x => x.productId == productId)

      .Select<Order, ICustomer>(x => x.Customer).Distinct();

  }

}

public class OrderRepository : IOrderRepository {

  private readonly MyDatabaseDataContext _dataBase;

  public OrderRepository(MyDatabaseDataContext db)

  {

    if (db == null)

      throw new ArgumentNullException("db");

    _dataBase = db;

  }

  public IOrder GetOrderByld(Guid orderld)