Как реализовать наследование службы из общего репозитория?

Я работаю над приложением asp.net core mvc blazor, у меня проблема: я не могу реализовать сервис, наследуемый от универсального репозитория.

что означает, как наследоваться от IRepository, чтобы получить функции ниже в службе имен серверов классов:

Вставлять

Обновлять

GetById

получить список

Жетлистасинк

Общий репозиторий интерфейса

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

public interface IRepository<TEntity> where TEntity : class
{
    

    Task<int> Count(Expression<Func<TEntity, bool>> where);
    TEntity GetByID(object id);
    TEntity Insert(TEntity entity);
    void Update(TEntity entityToUpdate);
    Task<ICollection<TType>> Get<TType>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TType>> select) where TType : class;
    Task<bool> Any(Expression<Func<TEntity, bool>> where);
    TEntity GetFirst(Expression<Func<TEntity, bool>> where);
    TEntity Single(Expression<Func<TEntity, bool>> where);
    Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> where);
    List<TEntity> GetList(Expression<Func<TEntity, bool>> where);
    Task<bool> UpdateBasedOnCondition(Expression<Func<TEntity, bool>> where, Action<TEntity> select);
    void Save();

}

класс, который реализует интерфейс, как показано ниже:

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;

using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using UC.AppRepository.Core;

public class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
    internal AppsRepositoryDBContext _context;
    internal DbSet<TEntity> dbSet;

    public BaseRepository(AppsRepositoryDBContext context)
    {
        _context = context;
        this.dbSet = _context.Set<TEntity>();
    }

    public virtual TEntity GetByID(object id)
    {
        return dbSet.Find(id);
    }

    public virtual TEntity Insert(TEntity entity)
    {
        var result = dbSet.AddAsync(entity).Result.Entity;
        Save();
        return result;
    }

 

  

    public virtual void Update(TEntity entityToUpdate)
    {
        dbSet.Attach(entityToUpdate);
        _context.Entry(entityToUpdate).State = EntityState.Modified;
    }


    public virtual async Task<bool> UpdateBasedOnCondition(Expression<Func<TEntity, bool>> where, Action<TEntity> select)
    {
        try
        {
            var ListOfRecord = await dbSet.Where(where).ToListAsync();
            if (null != ListOfRecord && ListOfRecord.Count > 0)
            {
                ListOfRecord.ForEach(select);
                //  Save();
                await _context.SaveChangesAsync();
                return true;
            }
            return false;
        }
        catch (Exception ex)
        {
            return false;
            throw;
        }

    }

    public async Task<ICollection<TType>> Get<TType>(Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, TType>> select) where TType : class
    {
        if (where == null)
        {
            return await dbSet.Select(select).ToListAsync();
        }
        return await dbSet.Where(where).Select(select).ToListAsync();
    }


    public async Task<int> Count(Expression<Func<TEntity, bool>> where)
    {
        return await dbSet.Where(where).CountAsync();
    }


  


    public async virtual Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> where)
    {

        //  var test = dbSet.Where(where).ToList();
        return await dbSet.Where(where).ToListAsync();

    }

    public virtual List<TEntity> GetList(Expression<Func<TEntity, bool>> where)
    {
        return dbSet.Where(where).ToList();

    }



    public async Task<bool> Any(Expression<Func<TEntity, bool>> where)
    {
        return await dbSet.AnyAsync(where);
    }

    public TEntity GetFirst(Expression<Func<TEntity, bool>> where)
    {
        return dbSet.FirstOrDefault(where);
    }

    public TEntity Single(Expression<Func<TEntity, bool>> where)
    {
        return dbSet.Single(where);
    }

    public void Save()
    {
        try
        {
            _context.SaveChanges();
        }
        catch (Exception ex)
        {

            throw;
        }

    }
}

поэтому у меня есть класс ServerNameService и интерфейс класса IserverNamesService Мне нужно реализовать функции вставки, обновления, selectById, selectall для моделей имен серверов. от base repository

 public class ServerNameService:IRepository
    {
// what i write here
    }


 public interface IserverNamesService:IRepository
    {
// what i write here
    }



public class ServerNames
    {
        [Key]
        public int ServerID { get; set; }
        public string Server_Name{ get; set; }
        public string Server_Type { get; set; }
        public string Operating_System { get; set; }
        public string Version { get; set; }
        public bool IsActive { get; set; }

    }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны передать свою сущность как общий тип в IRepository в IServerNamesService, а затем наследовать ServerNameService от IServerNamesService.

public interface IServerNamesService:IRepository<ServerNames>
{
    // your methods interface 
}
    
  public class ServerNameService:IServerNamesService{
         private readonly IRepository<ServerNames> _repository;
    
         public class ServerNameService(IRepository<ServerNames> repository)
         {
             _repository = repository;
         }
         //body of your methods
   }

спасибо за ответ, так как же вызвать эту функцию внутри общедоступного виртуального TEntity контроллера GetByID (идентификатор объекта) { return dbSet.Find (id); }

ahmed abdelaziz 13.02.2023 13:40
Ответ принят как подходящий

У меня проблема. Я не могу реализовать службу, наследуемую от универсального репозитория. У меня есть класс ServerNameService и интерфейс класса IserverNamesService. Мне нужно реализовать функции вставки, обновления, selectById, selectall для моделей имен серверов из базового репозитория.

Что ж, чтобы напрямую ответить на ваш вопрос, реализовать ваш ServerNameService, производный от IRepository, который будет выглядеть следующим образом:

Исервернамессервис:

public interface IserverNamesService : IRepository<ServerNames>
    {

    }

Примечание. Оставьте его пустым, поскольку мы будем использовать IRepository и BaseRepository в классе ServerNamesService для реализации его членов.

Сервернамессервис:

public class ServerNamesService : BaseRepository<ServerNames>, IserverNamesService
    {
        public ServerNamesService(ApplicationDbContext context) : base(context)
        {
        }


        public override ServerNames GetByID(object id)
        {
            return _context.ServerNames.Where(sn => sn.ServerID == (int)id).FirstOrDefault();

        }
    }

Контроллер:

[Route("api/[controller]")]
[ApiController]
public class ServerNamesServiceController : ControllerBase
{

    private readonly IserverNamesService _serverNamesService;

    public ServerNamesServiceController(IserverNamesService namesService)
    {
        _serverNamesService = namesService;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetById(object id)
    {
        var item = _serverNamesService.GetByID(id);

        if (item == null)
            return NotFound();

        return Ok(item);
    }

}

Программа.cs:

builder.Services.AddScoped<IserverNamesService, ServerNamesService>();

Примечание. Зарегистрируйте свой класс ServerNamesService в файле program.cs.

Реализация шаблона UnitOfWork:

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

Интерфейс:

 public interface IUnitOfWork
    {
        IserverNamesService ServerNamesService { get; }
        Task CompleteAsync();
    }

Выполнение:

public class UnitOfWork : IUnitOfWork, IDisposable
    {
        private readonly ApplicationDbContext _context;
       
        public IserverNamesService ServerNamesService { get; private set; }

       

        public UnitOfWork(ApplicationDbContext context)
        {
            _context = context;
            ServerNamesService = new ServerNamesService(context);
        }
       
        public async Task CompleteAsync()
        {
            await _context.SaveChangesAsync();
        }

        public void Dispose()
        {
            _context.Dispose();
        }
    }

Контроллер:

    [Route("api/[controller]")]
    [ApiController]
    public class ServerNamesServiceController : ControllerBase
    {

        private readonly IUnitOfWork _unitOfWork;
        public ServerNamesServiceController(IUnitOfWork unitOfWork)
        {
            _unitOfWork = unitOfWork;
        }


        [HttpGet("{id}")]
        public async Task<IActionResult> GetById(object id)
        {
            var item = _unitOfWork.ServerNamesService.GetByID(id);

            if (item == null)
                return NotFound();

            return Ok(item);
        }

    }

Выход:

Примечание. Если вы хотите узнать больше о шаблоне репозитория , вы можете ознакомиться с нашим официальным документом здесь и рабочим образцом здесь.

Другие вопросы по теме