2016-12-30 3 views
0

Я создаю ASP многоуровневый веб-приложение, и я иметь следующую структуру:C# наследование интерфейса - не узнавая методы базового интерфейса

IService<T>

public interface IService<T> { 

    IEnumerable<T> GetAll(); 
    void Add(T entity); 
    void Delete(T entity); 

Service<T>

public class Service<T> where T : class { 

     private IRepository<T> _repository; 

     public Service(IRepository<T> repo) { 
      this._repository = repo; 
     } 

     public IEnumerable<T> GetAll() { 
      return _repository.GetAll(); 
     } 

etc 

А потом У меня также есть некоторые «таможенные услуги»:

ICategoryService

public interface ICategoryService : IService<Category> { 

     IEnumerable<Category> GetProductCategories(int productId); 

    } 

CategoryService

public class CategoryService : Service<Category>, ICategoryService { 

     private IRepository<Category> _repository; 

     public CategoryService(IRepository<Category> repo) : base(repo) { 
      this._repository = repo; 
     } 

     public IEnumerable<Category> GetProductCategories(int productId) { 
      // implementation 
     } 

Контроллер:

public class ProductController : Controller { 
     private ICategoryService _cservice; 

     public ProductController(ICategoryService cservice) { 
      this._cservice = cservice; 
     } 
     ´ 
     // other methods 

     public ActionResult Categories() { 
       IEnumerable<Category> categories = _cservice.GetAll(); // doesn't work 
     } 

Я пытаюсь получить доступ к методу .GetAll() в мой контроллер, который был определен в IService и внедрено в Сервис, но я получаю «ICategoryService не содержит определения для GetAll», и я понятия не имею, почему.

Я могу получить доступ к методу .GetAll() из моего сервиса CategoryService, поэтому не знаю, почему я не могу получить к нему доступ из экземпляра CategoryService (через инъекцию зависимостей).

+0

Можете ли вы показать полный код вашего контроллера (с помощью реквизита и конструктора)? Этот код выглядит хорошо. –

+0

Все, что я могу придумать, - это то, что у вас есть служба ICategoryService или IService, определенная дважды, и она принимает неверный интерфейс. –

+0

Обновлено сообщение с кодом контроллера – Acla

ответ

4

Вы могли бы сделать опечатку при размещении кода, но, кажется, что Service<T> не реализует IService<T> изменять реализацию класса для:

public class Service<T> : IService<T> 
    where T : class 
{ 

    private IRepository<T> _repository; 

    public Service(IRepository<T> repo) { 
     this._repository = repo; 
    } 

    public IEnumerable<T> GetAll() { 
     return _repository.GetAll(); 
    } 

Я также хотел бы переместить where T : class ограничение из класса интерфейс.

+0

Nevermind, это сработало! :) Спасибо! * пинает себя за то, что не замечает такую ​​глупую ошибку * – Acla

Смежные вопросы