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
>}
Хранилище для заказчиков позволит выбирать заказчика по идентификатору и выбирать всех заказчиков, связанных с определенным товаром.
>public interface IOrderRepository {
> IOrder GetOrderById(Guid orderId);
> IEnumerable
>}
Хранилище для заказов позволит выбирать заказ по идентификатору и список заказов определенного заказчика.
>public interface IProductRepository {
> IProduct GetProductById(Guid productId);
> IEnumerable
> IEnumerable
>}
Хранилище для товаров позволит найти товар по идентификатору, список товаров по наименованию и список товаров, которые доступны в данный момент.
Реализация данных хранилищ не составляет труда (листинг 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
> if (productId == Guid.Empty)
> throw new ArgumentException("customerId");
> return _dataBase.Orders
> .Where(x => x.productId == productId)
> .Select
> }
>}
>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
> {
> if (customerId == Guid.Empty)
> throw new ArgumentException("customerId");
> return _dataBase.Orders
> .Where(x => x.customerId == customerId)
> .Select
> }
>}
>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
> {
> return _dataBase.Products.Where(x => x.isAvailable)
> .Select
> }
> public IEnumerable
> {
> if (string.IsNullOrEmpty(name))
> throw new ArgumentException("name");
> return _dataBase.Products
> .Where(x => x.name.Contains(name))
> .Select
> }
>}
Далее создадим сервисы, которые будут помогать нам манипулировать данными. Сначала определим интерфейсы сервисов:
>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 Inc. превосходит даже самые смелые ожидания инвестиционных аналитиков.Целеустремленность, научный талант, творческий поиск, смелость и любовь к эксперименту основателей компании – бывшего москвича Сергея Брина и выходца из штата Мичиган Ларри Пейджа – проложили путь к долгосрочному успеху компании. Под их руководством поисковый механизм Google стал популярнейшим ресурсом, который пользователи любят за удобство и уже испытывают к нему сильную эмоциональную привязанность.
«Даркнет» – это рассказ о цифровой революции в мире медиа. В битве между технологическим прогрессом и медиа-магнатами решается будущее кино, музыки, телевидения, компьютерных игр и Интернета. В этой книге вы найдете истории людей, оказавшихся в эпицентре битвы. «Даркнет» увлечет вас в тайный мир киноподполья, где бутлегеры и пираты скрываются от закона и Голливуда. Но не только в подполье делается цифровая революция: множеству приверженцев цифрового образа жизни, творцам фан-фикшн, диджеев, кинематографистам-любителям, пионерам телевидения нового поколения и разработчикам игр приходится противостоять могущественным силам, стремящимся сохранить статус-кво.
Черный PR сегодня активно перемещается в Интернет. В свое время кольт сделал людей равными. Сегодня Интернет уравнял финансово сильных и слабых в медиапространстве. Глобальная сеть позволяет рядовому человеку разорить могущественную корпорацию. Маленькая компания может эффективно противостоять транснациональному монстру, не располагая никакими финансами. Умение отражать информационные атаки стало на редкость насущной проблемой для любого бизнеса.В этой книге показаны все необходимые для отражения информационного нападения в Интернет инструменты и раскрыты секреты их применения.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.