Skip to content

Расширения для Entity Framework Core

Notifications You must be signed in to change notification settings

Infarh/MathCore.EF7

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

87 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MathCore.EF7

Набор библиотек-расширений и шаблонов реализаций для обеспечения взаимодействия с базой данных, Api и клиентом для серверных приложений.

Repositories

Для работы с базой данных доступны репозитории и фабрика:

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)
При необходимости реализации можно переопределить унаследовавшись.

Context

Упростить инициализацию экземпляра БД при старте приложения поможет DBInitializer<TContext> или аналогично DBFactoryInitializer<TContext>

пример реализации

подключаем сервис services.AddTransient<TestContextInitializer>();

Вызываем сервис

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, TestContextInitializer context)
        {
            context.InitializeAsync().Wait();
	...

Clients

Для взаимодействия с клиентом реализован WebRepository<TEntity, TKey>

Возможности клиента:


🔥 Конечные точки
    Get
    • 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)
    Post
    • Task Exist(TEntity item, CancellationToken Cancel = default)
    • Task Add(TEntity item, CancellationToken Cancel = default)
    • Task AddRange(IEnumerable items, CancellationToken Cancel = default)
    Put
    • Task Update(TEntity item, CancellationToken Cancel = default)
    • Task UpdateById(TKey id, Action ItemUpdated, CancellationToken Cancel = default)
    • Task UpdateRange(IEnumerable items, CancellationToken Cancel = default)
    Delete
    • Task Delete(TEntity item, CancellationToken Cancel = default)
    • Task DeleteRange(IEnumerable items, CancellationToken Cancel = default)
    • Task DeleteById(TKey id, CancellationToken Cancel = default)

При необходимости реализации можно переопределить унаследовавшись. И например изменить адреса конечных точек, которые в апи реализованы как 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).

Controllers

Шаблон реализации представлен в ApiController<TEntity, TKey> или ApiController<TEntity> аналогично репозиториям. Конечные точки идентичны точкам WebRepository.


🔥 Конечные точки
    Get
    • [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()
    Post
    • [HttpPost("exist")]
      Task Exist(TEntity item)
    • [HttpPost]
      Task Add(TEntity item)
    • [HttpPost("range")]
      Task AddRange(IEnumerable items)
    Put
    • [HttpPut]
      Task Update(TEntity item)
    • [HttpPut("{id}")]
      Task UpdateById(TKey id, Action ItemUpdated)
    • [HttpPut("range")]
      Task UpdateRange(IEnumerable items)
    Delete
    • [HttpDelete]
      Task Delete(TEntity item)
    • [HttpDelete("range")]
      Task DeleteRange(IEnumerable items)
    • [HttpDelete("{id}")]
      Task DeleteById(TKey id)