}
Воспользуемся мастером создания модели LINQ для SQL, чтобы сгенерировать классы для работы с базой данных. Посмотрим на сгенерированный код для таблицы Customers
(приведен только фрагмент кода):
public partial class Customer : INotifyPropertyChanging,
INotifyPropertyChanged
{
private System.Guid _customerId;
private string _name;
private string _address;
private string _phone;
private EntitySet _Orders;
public Customer()
{
// код
}
[Column(Storage="_customerId",
DbType="UniqueIdentifier NOT NULL",
IsPrimaryKey=true)] public System.Guid customerId {
get { return this._customerId; }
set { // код }
}
[Column(Storage="_name",
DbType="NVarChar(250) NOT NULL", CanBeNull=false)]
public string name {
get { return this._name; }
set { // код }
}
[Column(Storage="_address",
DbType="NVarChar(1024) NOT NULL",
CanBeNull=false)]
public string address {
get { return this._address; }
set { // код }
}
[Column(Storage="_phone", DbType="NVarChar(250)")]
public string phone {
get { return this._phone; }
set { // код }
}
[Association(Name="Customer_Order",
Storage="_Orders", ThisKey="customerId",
OtherKey="customerId")]
public EntitySet Orders {
get { return this._Orders; }
set { this._Orders.Assign(value); }
}
}
Полученный код примечателен тем, что класс Customer
является partial-классом, а это значит, что мы можем легко расширить его, и все прочие классы, для поддержки наших интерфейсов. Создадим частичные классы для реализации интерфейсов на базе LINQ для SQL так, как показано в листинге 3.2.
Листинг 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 GetCustomersByProduct(Guid productId);
}
Хранилище для заказчиков позволит выбирать заказчика по идентификатору и выбирать всех заказчиков, связанных с определенным товаром.
public interface IOrderRepository {
IOrder GetOrderById(Guid orderId);
IEnumerable GetCustomerOrders(Guid customerId);
}
Хранилище для заказов позволит выбирать заказ по идентификатору и список заказов определенного заказчика.
public interface IProductRepository {
IProduct GetProductById(Guid productId);
IEnumerable GetAvailableProducts();
IEnumerable 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)
Читать дальше
Конец ознакомительного отрывка
Купить книгу