ASP.NET MVC Framework - [17]

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

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

>      throw new ArgumentException("customerId");


>    return _dataBase.Customers

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

>  }


>  public IEnumerable GetCustomersByProduct(Guid productId) {

>    if (productId == Guid.Empty)

>      throw new ArgumentException("customerId");


>    return _dataBase.Orders

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

>      .Select(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)

>  {

>    if (orderId == Guid.Empty)

>      throw new ArgumentException("orderId");


>    return _dataBase.Orders

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

>  }


>  public IEnumerable GetCustomerOrders(Guid customerId)

>  {

>    if (customerId == Guid.Empty)

>      throw new ArgumentException("customerId");


>    return _dataBase.Orders

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

>      .Select(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 GetAvailableProducts()

>  {

>    return _dataBase.Products.Where(x => x.isAvailable)

>      .Select(x => x);

>  }


>  public IEnumerable GetProductListByName(string name)

>  {

>    if (string.IsNullOrEmpty(name))

>      throw new ArgumentException("name");


>    return _dataBase.Products

>      .Where(x => x.name.Contains(name))

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


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

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


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

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


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

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


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

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


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

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


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

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