2 messaggi dal 04 novembre 2019
Salve
sto realizzando una web app in .Net Core e Entity Framework
Ho creato anzitutto questa interfaccia generica
public interface IGenericService<T>
    {
        Task<T> GetItemValueAsync(uint siteId);
        Task<IEnumerable<T>> GetItemValuesAsync(uint siteId);
        Task<bool> SaveItemAsync(T t, uint insertUserId, uint siteId);
        Task<bool> DeleteItemAsync(int? id, uint siteId, uint userId);
        Task<bool> UpdateItemAsync(int? id, uint siteId, uint userId, T t);
        Task<bool> SetItemInvalidAsync(uint siteId, uint userId, T t);
    }


e un servizio che implementa l'interfaccia
public class LocationService : IGenericService<LOCATION> {
DBContext _context;

        public LocationService(DBContext ctx)
        {
            _context = ctx;
        }

        public async Task<LOCATION> GetItemValueAsync(uint siteId)
        {
            var locationItem = await _context.LOCATION.Where(loc => loc.SiteId == siteId && loc.DataStatus == 0).FirstOrDefaultAsync();
            return locationItem;
        }

        ....
//altri metodi che gestiscono l'insert / update / delete su DB

infine il controller
public class LOCATIONController : Controller
    {
        private readonly IGenericService<LOCATION> _service;
        private readonly IMapper _mapper;

        public LOCATIONController(IGenericService<LOCATION> service, IMapper mapper)
        {
            _service = service;
            _mapper = mapper;
        }

        // GET: LOCATION
        public async Task<IActionResult> Index()
        {
            var item = await _service.GetItemValueAsync(70);
            if (item != null)
            {
                List<LOCATIONViewModel> lvmList = new List<LOCATIONViewModel>();
                foreach(var location in item)
                {
                    var locationVM = _mapper.Map<LOCATIONViewModel>(location);
                    lvmList.Add(locationVM);
                }
                
                return View(lvmList);
            }
            return View();
        }
//etc etc


ora mi sono reso conto che ci sarebbero altre classi che implementerebbero praticamente la stessa interfaccia in modo identico dove in sostanza cambierebbe solo l'entità del db cui fare riferimento

ad esempio:
public class ClimAvgService : IGenericService<CLIM_AVG>
    {
        DBContext _context;

        public ClimAvgService(DBContext ctx)
        {
            _context = ctx;
        }

        public async Task<CLIM_AVG> GetItemValueAsync(uint siteId)
        {
            var item = await _context.CLIM_AVG.Where(x=> x.SiteId == siteId && x.DataStatus == 0).FirstOrDefaultAsync();
            return item;
        } // e di seguito gli altri metodi


e siccome la situazione potrebbe verificarsi per molte altre classi / entità del progetto, correrei il rischio di fare N servizi identici
vorrei sapere se esiste la possibilità di creare un service che rimane generico (qualcosa del tipo
public class GenericService<T> : IGenericService<T> where T : class, new()
) e poi dai vari controller istanziare a run time il tipo da passare al service generico
 public class CLIM_AVGController : Controller
    {
        private readonly IMapper _mapper;
        private readonly IGenericService<???> _service;

        public CLIM_AVGController(IGenericService<???> service, IMapper mapper)
        {
            _service = service;
            _mapper = mapper;
        }

        // GET: CLIM_AVG
        public async Task<IActionResult> Index()
        {
            var climate = await ....//passare il tipo CLIM_AVG al servizio GenericService<T>....
            if (climate != null)
            { 
                var climateVM = _mapper.Map<CLIM_AVGViewModel>(climate);
                return View(climateVM);
            }

            return View();
        }

in parole povere, mantenere la genericità del servizio risolvendo a runtime il tipo e l'entità su cu operare
spero di essere stato chiaro
grazie
2 messaggi dal 04 novembre 2019
Credo di aver risolto grazie a questa risorsa, che condivido per quanto è stata illuminante https://ngohungphuc.wordpress.com/2018/05/01/generic-repository-pattern-in-asp-net-core/

grazie

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.