Я приказываю избегать DRY Я рискнул воплотить идею генерации базового c базового класса для всех моих контроллеров. Все было хорошо до момента вставки сервисного класса. Мой базовый контроллер:
basecontroller.cs
public class BaseController<TEntity, Tdto, TKey> : Controller
{
protected TavoraContext _context;
protected IMapper _mapper;
private IGeneric<TEntity, TKey, Tdto> _srv;
public BaseController(IGeneric<TEntity, TKey, Tdto> srv)
{
_srv = srv;
}
Затем в одном из контроллеров:
companiescontroller.cs
public class CompaniesController : BaseController<Company, CompanySimpleDTO, long>
{
public CompaniesController(TavoraContext context, IMapper mapper, CompaniesService companiesService) : base(companiesService)
{
}
CompaniesService наследуется от GenericService, который реализует IGeneri c, поэтому, по моему мнению, не должно быть никакой ошибки, и я получаю: «Невозможно преобразовать CompaniesService в IGeneri c '
companiesservice.cs
public class CompaniesService : GenericService<Company, long, CompanyDTO>
{
public CompaniesService(TavoraContext context, IMapper mapper) : base(context, mapper)
{
_runner = new RunnerWriteDb<CompanyDTO, Company>(
new WriteCompanyAction(
new WriteCompanyDBAccess(context), mapper), context);
}
genericservice.cs
public class GenericService<TEntity, TKey, Tdto> : IGeneric<TEntity, TKey, Tdto> where TEntity : BaseEntity<TKey>
{
protected RunnerWriteDb<Tdto, TEntity> _runner;
protected readonly int PAGESIZE = 20;
protected readonly TavoraContext _context;
protected DbSet<TEntity> _currentEntity;
protected IMapper _mapper;
public GenericService(TavoraContext context, IMapper mapper)
{
_context = context;
_currentEntity = _context.Set<TEntity>();
_mapper = mapper;
}
IGeneri c .cs
public interface IGeneric<TEntity, TKey, Tdto>
{
IQueryable<TEntity> GetAll();
IQueryable<DTO> GetAll<DTO>();
//void Add(TEntity newItem);
//void AddRange(List<TEntity> newItems);
bool Update(TEntity updateItem);
void UpdateRange(List<TEntity> updateItems);
bool Delete(TKey id);
bool DeleteRange(List<TEntity> removeItems);
TEntity GetById(TKey id);
RunnerWriteDbResult<TKey> Write(Tdto dto);
}