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
Использовал синглтон…