ASP.NET MVC Framework - [16]

Шрифт
Интервал

Возможность замены источника данных

Для более наглядного примера потребности в промежуточном коде и необходимости предусматривать возможные изменения в работе с ORM приведем случай из практики одного из авторов книги. Компания, в которой он работал, разрабатывала крупный проект, работающий с использованием SQL Server 2000. После нескольких лет разработки и поддержки, заказчик пожелал сменить SQL Server на другую СУБД. В связи с тем, что код проекта был жестко завязан на особенностях SQL Server, такой переход стоил больших усилий всего персонала компании.

В то время еще не существовало LINQ для SQL, но даже если бы компания использовала этот ORM, ей все равно пришлось бы переписывать подавляющую часть кода работы с данными в связи с тем, что LINQ для SQL не поддерживает ничего, кроме SQL Server.

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

Реализация слоя данных

Создадим простейший слой для работы с базой данных, который отвечал бы всем нашим требованиям. Для начала возьмем простую структуру базы данных (рис. 3.5).

Рис. 3.5. Структура базы данных


У нас есть три таблицы: заказчики, заказы и товары. Каждая из таблиц содержит набор свойственных ей полей, так в таблице >Products (товары) есть поле >isAvailible, которое показывает, доступен ли товар в настоящее время. У таблицы >Orders (заказы) есть поля >count — количество товара в штуках и >orderDateTime — дата и время оформления заказа. Таблица >Customers (заказчики) содержит информацию о заказчике.

Для реализации хранилищ и сервисов нам необходимы интерфейсы данных, определим их так, как показано в листинге 3.1.


Листинг 3.1. Интерфейсы данных

>public interface ICustomer {

>  Guid CustomerId { set; get; }

>  string Name { set; get; }

>  string Phone { set; get; }

>  string Address { set; get; }

>}


>public interface IOrder {

>  Guid OrderId { set; get; }

>  Guid CustomerId { set; get; }

>  Guid ProductId { set; get; }

>  int Count { set; get; }

>  DateTime OrderDateTime { set; get; }

>}


>public interface IProduct {

>  Guid ProductId { set; get; }

>  string Name { set; get; }

>  bool IsAvailible { set; get; }

>  bool Cost { set; get; }

>}


Воспользуемся мастером создания модели 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; }


Рекомендуем почитать
Черный список

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Добавьте в корзину. Ключевые принципы повышения конверсии веб-сайтов

Работа сайта похожа на работу обычного магазина: если секции с разными товарами расположены логично, консультанты доступны в любой момент, а описания товаров информативны и понятны, есть шанс, что человек, зашедший в магазин, не уйдет с пустыми руками. Проанализируйте характеристики ваших потенциальных клиентов, поймите, что для них является ценностью, какие аргументы привлекут их внимание, соответственно этому продумайте структуру сайта, спроектируйте «маршрут» передвижения и составьте описания товаров – и ваши посетители будут гораздо чаще, чем сейчас, кликать на значок «корзины», а вы в разы повысите один из главных показателей работы сайта – конверсию.


Google. Прорыв в духе времени

Эта книга – захватывающая история самой успешной Интернет-компании в мире. В последнее время финансовый результат деятельности Google Inc. превосходит даже самые смелые ожидания инвестиционных аналитиков.Целеустремленность, научный талант, творческий поиск, смелость и любовь к эксперименту основателей компании – бывшего москвича Сергея Брина и выходца из штата Мичиган Ларри Пейджа – проложили путь к долгосрочному успеху компании. Под их руководством поисковый механизм Google стал популярнейшим ресурсом, который пользователи любят за удобство и уже испытывают к нему сильную эмоциональную привязанность.


Даркнет: Война Голливуда против цифровой революции

«Даркнет» – это рассказ о цифровой революции в мире медиа. В битве между технологическим прогрессом и медиа-магнатами решается будущее кино, музыки, телевидения, компьютерных игр и Интернета. В этой книге вы найдете истории людей, оказавшихся в эпицентре битвы. «Даркнет» увлечет вас в тайный мир киноподполья, где бутлегеры и пираты скрываются от закона и Голливуда. Но не только в подполье делается цифровая революция: множеству приверженцев цифрового образа жизни, творцам фан-фикшн, диджеев, кинематографистам-любителям, пионерам телевидения нового поколения и разработчикам игр приходится противостоять могущественным силам, стремящимся сохранить статус-кво.


Противодействие черному PR в Интернете

Черный PR сегодня активно перемещается в Интернет. В свое время кольт сделал людей равными. Сегодня Интернет уравнял финансово сильных и слабых в медиапространстве. Глобальная сеть позволяет рядовому человеку разорить могущественную корпорацию. Маленькая компания может эффективно противостоять транснациональному монстру, не располагая никакими финансами. Умение отражать информационные атаки стало на редкость насущной проблемой для любого бизнеса.В этой книге показаны все необходимые для отражения информационного нападения в Интернет инструменты и раскрыты секреты их применения.


Образование русскоязычного сегмента Фидонет в Западной Европе

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.