'Generic C# Repository, service and controller design

Im learning about generics and was wondering about how a generic controller, service and ef core repo design would look like.

My case: lets say an incomming post request to add Smartphone and keyboard object to smartphone and keyboard tables

My repository setup is

    public class GenericRepository<TEntity> : IGenericRepository<TEntity>
                where TEntity : class, IProductGenericEntities
{
    private readonly MyDbContext _db;
    public GenericRepository(MyDbContext db)
    {
        _db = db;
    }

    public async Task<bool> AddProduct(TEntity entity)
    {
        try
        {
            _db.Set<TEntity>().AddAsync(entity);
            return (await _db.SaveChangesAsync()) > 0;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }
    }
}

And my service

    public class ProductService<TEntity> : IProductService<TEntity>
            where TEntity : class
{
    private readonly IGenericRepository<TEntity> _repo;

    public ProductService(IGenericRepository<TEntity> repo)
    {
        _repo = repo;
    }


    public async Task<bool> AddProduct(TEntity entity)
    {
        return await _repo.AddProduct(entity);
    }

}

And my Controller.cs

    [ApiController]
[Route("api/[controller]")]
public class ProductController
{
    private readonly IProductService<Keyboards> _keyService;
    private readonly IProductService<Smartphones> _smartService;

    public ProductController(IProductService<Keyboards> keyService, IProductService<Smartphones> smartService)
    {
        _keyService = keyService;
        _smartService = smartService;
    }

    [HttpPost("Post-generated-items")]
    public async Task<ActionResult> PostProducts(List<TEntity> entities)
    {
        foreach(var item in entities)
        {
            and sort the objects here
        }
        
    }
}

is it correct to initialize 2 of IProductServices and sort the incomming objects to their correct DI on the controller?

    private readonly IProductService<Keyboards> _keyService;
private readonly IProductService<Smartphones> _smartService;

Is there a way to make it more automatic by detecting incomming object type and then initilize it all the way to repo so i dont need 2 of IProductService<>?

Or is it what im doing plain wrong with a generic service layor?



Solution 1:[1]

It feels like you are a beginner to all of this. You are making a simple mistake. You mentioned that images are inside components at path /images. So you should be able to access images like /components/images/image-1.jpg. You are not able to access images because /images is not a direct child of public directory.

Similarly, all CSS and JS files can be accessed /css/filepath and /js/filepath respectively.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Sandeep Patel