Набор библиотек-расширений и шаблонов реализаций для обеспечения взаимодействия с базой данных, Api и клиентом для серверных приложений.
Для работы с базой данных доступны репозитории и фабрика:
public static IServiceCollection AddTestRepositories(this IServiceCollection services) =>
services
.AddScoped(typeof(IRepository<>), typeof(Your_DbRepository<>))
.AddScoped(typeof(IRepository<,>), typeof(Your_DbRepository<,>));
public static IServiceCollection AddTestRepositoryFactories(this IServiceCollection services) =>
services
.AddScoped(typeof(IRepository<>), typeof(Your_DbContextFactoryRepository<>))
.AddScoped(typeof(IRepository<,>), typeof(Your_DbContextFactoryRepository<,>));
где:
Your_DbRepository - реализация репозитория, унаследованная от базового класса DbRepository Your_DbContextFactoryRepository - реализация фабрики репозитория, унаследованная от базового класса DbContextFactoryRepository
Вызов репозитория происходит при запросе экземпляра интерфейса IRepository<Student>
, где Student - некий класс унаследованный от Entity
, в данном контексте у сущности id представляет тип int32
При необходимости выбрать другой тип ключа сущность должна быть унаследована от Entity<Tkey>
, где Tkey - тип ключа (например Guid
), в этом случае обращение к репозиторию происходит при запросе IRepository<Student,Guid>
Вызов фабрики происходит сжожим способом.
Возможности репозитория:
🔥 Конечные точки
- Task IsEmpty(CancellationToken Cancel = default)
- Task ExistId(TKey Id, CancellationToken Cancel = default)
- Task GetCount(CancellationToken Cancel = default)
- Task> GetAll(CancellationToken Cancel = default)
- Task> Get(int Skip, int Count, CancellationToken Cancel = default)
- Task> GetPage(int PageNumber, int PageSize, CancellationToken Cancel = default)
- Task GetById(TKey Id, CancellationToken Cancel = default)
- Task SaveChanges(CancellationToken Cancel = default)
- Task Exist(TEntity item, CancellationToken Cancel = default)
- Task Add(TEntity item, CancellationToken Cancel = default)
- Task AddRange(IEnumerable items, CancellationToken Cancel = default)
- Task Update(TEntity item, CancellationToken Cancel = default)
- Task UpdateById(TKey id, Action ItemUpdated, CancellationToken Cancel = default)
- Task UpdateRange(IEnumerable items, CancellationToken Cancel = default)
- Task Delete(TEntity item, CancellationToken Cancel = default)
- Task DeleteRange(IEnumerable items, CancellationToken Cancel = default)
- Task DeleteById(TKey id, CancellationToken Cancel = default)
Упростить инициализацию экземпляра БД при старте приложения поможет DBInitializer<TContext>
или аналогично DBFactoryInitializer<TContext>
подключаем сервис services.AddTransient<TestContextInitializer>();
Вызываем сервис
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, TestContextInitializer context)
{
context.InitializeAsync().Wait();
...
Для взаимодействия с клиентом реализован WebRepository<TEntity, TKey>
Возможности клиента:
🔥 Конечные точки
- Task IsEmpty(CancellationToken Cancel = default)
- Task ExistId(TKey Id, CancellationToken Cancel = default)
- Task GetCount(CancellationToken Cancel = default)
- Task> GetAll(CancellationToken Cancel = default)
- Task> Get(int Skip, int Count, CancellationToken Cancel = default)
- Task> GetPage(int PageNumber, int PageSize, CancellationToken Cancel = default)
- Task GetById(TKey Id, CancellationToken Cancel = default)
- Task SaveChanges(CancellationToken Cancel = default)
- Task Exist(TEntity item, CancellationToken Cancel = default)
- Task Add(TEntity item, CancellationToken Cancel = default)
- Task AddRange(IEnumerable items, CancellationToken Cancel = default)
- Task Update(TEntity item, CancellationToken Cancel = default)
- Task UpdateById(TKey id, Action ItemUpdated, CancellationToken Cancel = default)
- Task UpdateRange(IEnumerable items, CancellationToken Cancel = default)
- Task Delete(TEntity item, CancellationToken Cancel = default)
- Task DeleteRange(IEnumerable items, CancellationToken Cancel = default)
- Task DeleteById(TKey id, CancellationToken Cancel = default)
Get
Post
Put
Delete
При необходимости реализации можно переопределить унаследовавшись.
И например изменить адреса конечных точек, которые в апи реализованы как api/EntytyTypeName', т.е. для сущности студенов -
api/Student`
Переопределение точки производится в конструкторе с передачей в качестве serviceAddress:
public class TestStudentApiClient : WebRepository<Student>, IRepository<Student>
{
public TestStudentApiClient(IConfiguration configuration, ILogger<WebRepository<Student>> logger)
: base(configuration, logger/*,"api/ControllerName"*/) //раскомментировать для замены точки
{
}
public TestStudentApiClient(IConfiguration configuration, ILogger<WebRepository<Student>> logger, string serviceAddress)
: base(configuration, logger, serviceAddress)
{
}
}
регистрация сервиса: servide.AddScoped<IRepository<Student>,TestStudentApiClient>();
полный пример доступен в тестовом консольном проекте (адресс api читается из файла appsettings.json
).
Шаблон реализации представлен в ApiController<TEntity, TKey>
или ApiController<TEntity>
аналогично репозиториям.
Конечные точки идентичны точкам WebRepository.
🔥 Конечные точки
- [HttpGet("isempty")]
Task IsEmpty() - [HttpGet("exist/{Id}")]
Task ExistId(TKey Id) - [HttpGet("count")]
Task GetCount() - [HttpGet]
Task> GetAll() - [HttpGet("items[[{Skip:int}/{Count:int}]]")]
Task> Get(int Skip, int Count) - [HttpGet("page/{PageNumber:int}/{PageSize:int}")]
[HttpGet("page[[{PageNumber:int}/{PageSize:int}]]")]
Task> GetPage(int PageNumber, int PageSize) - [HttpGet("{Id}")]
Task GetById(TKey Id) - [HttpGet("save")][HttpPost("save")][HttpPut("save")]
Task SaveChanges() - [HttpPost("exist")]
Task Exist(TEntity item) - [HttpPost]
Task Add(TEntity item) - [HttpPost("range")]
Task AddRange(IEnumerable items) - [HttpPut]
Task Update(TEntity item) - [HttpPut("{id}")]
Task UpdateById(TKey id, Action ItemUpdated) - [HttpPut("range")]
Task UpdateRange(IEnumerable items) - [HttpDelete]
Task Delete(TEntity item) - [HttpDelete("range")]
Task DeleteRange(IEnumerable items) - [HttpDelete("{id}")]
Task DeleteById(TKey id)