03.05.2023

Моя цель — изучить C# и поделиться своими знаниями с людьми. Я упомянул примеры с кодами комментариев.

Мы продолжим RentCarProject(ReCapProject)

Требования:

-Создать слой WebAPI.

- Написать API-интерфейсы из сервисов бизнес-уровня…

-Испытать почтальона

Что такое ASP.Net?

-Это API.

-Asp.Net на самом деле является типом проекта.

- Asp.net — это среда веб-разработки Microsoft, а разработанная ею структура (.Net) — это фреймворк…

-. asp.net of (.net framework)…

-Это тип проекта, который мы разработали в рамках asp.net .Net framework.

- API позволяет нам работать с спокойной архитектурой.

-это может быть изменено в зависимости от языка кода.

-мы используем .Net, поэтому наш API ASP.Net

Серверная часть API= также работает, и, например, у нас есть результат, и мы публикуем его на сервере, и люди, которым мы предоставляем доступ, могут получить к нему доступ. И мы видим это в интерфейсе благодаря Angular, React, flutter и т. д. Также мы можем видеть структуру MVC, но она есть в старых проектах.

Обычно мы тестировали на уровне пользовательского интерфейса. Но теперь мы проверим API…

RESTFULL →приходит по протоколу HTTP

HTTP = (протокол передачи гипертекста) означает, что мы подключаемся к сети Ethernet для просмотра информации с сервера…

Когда мы их использовали, я объясню их коды протоколов…

TCP = (Протокол управления передачей) — если у вас нет подключения к Ethernet, мы используем только кабель, тогда мы можем использовать этот протокол.

Прежде чем мы рефакторим коды в бэкенде… Давайте сделаем это…

Также я буду использовать приложение Postman для тестирования этого проекта…

Я использовал это приложение Deskop для тестирования нашего WebAPI.

Раньше мы тестировали на стороне пользовательского интерфейса консоли, но теперь мы будем тестировать на уровне WepAPI.

Начнем 😊

Мы должны сначала выбрать «Установить как стартап-проект», затем IISS Express, мы должны выбрать их, чтобы использовать этот слой…

Моя цель - сначала плохой код, а потом мы его рефакторим, потому что в реальной жизни каждый раз одно и то же 😊

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

Обычно во внешнем интерфейсе, когда внешний интерфейс что-то запрашивает, контроллер будет делать то, что он хочет.

Потом будем писать коды в контроллеры…

Давайте сначала базовый метод, чтобы проверить это…

  [HttpGet]
        public string Get()
        {

            return "Hello";
        }

Тогда мы сможем это увидеть.

Давайте проверим для автомобилей…

Перед кодами мы должны добавить ссылку на использование свойств…

Давайте рассмотрим базовый пример для объекта Car…

[HttpGet]
        public List<Car> Get()
        {

            return new List<Car>
                {
new Car { BrandId=2,CarName="XC5",ColorId=3,ModelYear=2015,DailyPrice=750,Description="SUV 4x4"},
             
new Car { BrandId=3,CarName="XC60",ColorId=2,ModelYear=2017,DailyPrice=850,Description="Sedan"},
            };
        }

Также давайте управлять Почтальоном…

Мы видим формат JSON. Это результат Restfull.

Затем мы можем увидеть все автомобили из All dataBase.

  [HttpGet]
        public List<Car> Get()
        {
             //Dependency Chain 
            //We write here but it is depend on the CarManager.İt is bad code...
            ICarService carService = new CarManager(new EfCarDal());

            var result = carService.GetAll();
            //we return the datas about cars...
            return result.Data;

           
        }
//we will refactor them with SOLID princible.

Мы проверяем почтальона и видим их.

Давайте проверим эту ошибку…

Здесь он не может подключить CarsServices, потому что будет использовать CarManager или BrandManager. Это означает, что у Сервиса нет конкретных ссылок. Вот почему Мы должны их определить.

Затем мы можем использовать для них контейнер IoC (инверсия управления).

Мы можем использовать приложение Autofac или ninject для использования в .Net framework…

Контейнер IoC= похож на коробку. У нас есть только одна память в оперативной памяти. Это похоже на список

Это может быть новый экземпляр для списка, но это только один раз.

Например, я поместил в память newPm() и новый EfPD. Тогда кому они нужны, мы можем их отдать.

Например, в режиме реального времени у нас есть Carservice. Давайте проверим, что в контейнере IoC есть какие-либо сведения о CarService, после чего мы увидим, что CarManager наследует CarService в контейнере IoC. Это конфигурация.

Мы собираемся преобразовать program.cs в контейнер WepAPI в IoC…

Затем

Мы будем использовать все услуги для менеджеров …

builder.Services.AddSingleton<ICarService, CarManager>();

мы писали код в program.cs

затем

мы можем увидеть эту ошибку!

System.AggregateException: 'Некоторые службы не могут быть созданы (ошибка при проверке дескриптора службы 'ServiceType: Business.Abstract.ICarService Lifetime: Singleton RegistrationType: Business.Concrete.CarManager': невозможно разрешить service для типа "DataAccess.Abstract.ICarDal" при попытке активировать "Business.Concrete.CarManager".)'

Это означает, что некоторые услуги не могут быть новыми. И когда я обновляю автомобильные услуги. Автомобиль зависит от ICarDal, в этом случае я не могу их обновить.

Затем мы должны добавить ICarDal с EfCarDal…

builder.Services.AddSingleton<ICarService, CarManager>();
  
 builder.Services.AddSingleton<ICarDal, EfCarDal>();

мы добавили этот код в program.cs, после чего он работает, как показано ниже.

Мы использовали контейнер IoC, теперь для их использования не нужно использовать приложение Ninject или Autofac.

Но позже мы займемся АОП.

АОП (аспектно-ориентированное программирование) = когда мы использовали АОП, нам не нужно повторять кодовый метод или операцию. Тогда мы можем следовать SOLID prencible. Это очень полезный шаблон.

Например

[LogAspect]-›АОП

Это означает, что вы можете зарегистрировать этот метод. Это означает, что мы встроили туда коды.

А также я создал все бизнес-сервисы на уровне WepAPI.

Также я написал код для ссылок на использование конструкции.

builder.Services.AddSingleton<IBrandService, BrandManager>();


builder.Services.AddSingleton<IBrandDal, EfBrandDal>();

builder.Services.AddSingleton<ICarService, CarManager>();
builder.Services.AddSingleton<ICarDal, EfCarDal>();

builder.Services.AddSingleton<IColorService, ColorManager>();
builder.Services.AddSingleton<IColorDal, EfColorDal>();

builder.Services.AddSingleton<ICustomerService, CustomerManager>();
builder.Services.AddSingleton<ICustomerDal, EfCustomerDal>();

builder.Services.AddSingleton<IRentalService, RentalManager>();
builder.Services.AddSingleton<IRentalDal, EfRentalDal>();

builder.Services.AddSingleton<IUserService ,UserManager>();
builder.Services.AddSingleton<IUserDal, EfUserDal>();

Теперь давайте перейдем к рефакторингу кода…

Примечания для HTTP-кодов, на которых запрашивается веб-сайт. Это очень важно для нас. Я объясню также все HTTP-коды…

[ApiController] 
    public class CarsController : ControllerBase
    {
        //Loosely Coupled
        ICarService _carService; 
        public CarsController(ICarService carService)
        {
            //naming convencion
            _carService = carService;
        }

        [HttpGet]
        public IActionResult Get()
        {
            var result = _carService.GetAll();
            if (result.Success)
            {
                //we used datas with HTTP protocols 
                return Ok(result);
            }
            return BadRequest(result);
        }
    }

Затем

Затем, когда мы поддерживаем, например, мы возьмем BadRequestCode….

HttpGet=Я возьму что-нибудь, чтобы показать в системе

HttpPost=Я дам вам кое-что, чтобы добавить вашу систему

Теперь будем делать Пост в Авто

        [HttpPost]
        public IActionResult Post(Car car)
        {

            var result = _carService.Add(car);

            if (result.Success)
            {
                return Ok(result);
            }
            return BadRequest(result);
        }

Смотрим коды.

Тогда продолжим.

Давайте проверим базу данных.

И это было добавлено в PostgreSql…

Давайте напишем еще одну операцию… также, когда мы пишем Http, мы должны дать псевдоним для понимания, и когда мы использовали те же методы, но другую операцию, мы можем их понять. также они не будут раздавлены…

После рефакторинга эти коды…

public class CarsController : ControllerBase
    {
        //Loosely Coupled
        ICarService _carService; 
        public CarsController(ICarService carService)
        {
            //naming convencion
            _carService = carService;
        }

        [HttpGet("getall")]
        public IActionResult GetAll()
        {
            var result = _carService.GetAll();
            if (result.Success)
            {
                //we used datas with HTTP protocols 
                return Ok(result);
            }
            return BadRequest(result);
        }
        //HttpGet=I will take the something to show in the system
        //HttpPost=I will give you something to add your system also we can use the for Update and delete...
        [HttpPost("add")]
        public IActionResult Add(Car car)
        {

            var result = _carService.Add(car);

            if (result.Success)
            {
                return Ok(result);
            }
            return BadRequest(result);
        }

        [HttpGet("getbyid")]
        public IActionResult GetById(int Id)
        {
            var result = _carService.GetsCarsId(Id);
            if (result.Success)
            {
                return Ok(result);
            }
            return BadRequest(result);
        }
    }

Я добавил все операции к другим слоям….

Создал веб-API.

Добавлены сервисы в WebAPI

Использовал синглтон…