这都是快速输入的伪代码来说明问题。 我有一个实现接口的基类。 然后,我在两个子类中继承该类,这两个子类实现了自己的接口。 最后,我将其中一个子类注入到控制器中。
我的希望是可以调用基类的
Delete
和 GetSearches
方法以及子类的 GetCustomerSearchResults
方法。 但这不能编译。 因此,显然即使子类继承自实现该接口的类,也无法找到基类接口。
我还能如何做到这一点,以在基类中保留更通用的查找、保存、删除方法,同时在子类中拥有更具体的实体类型方法,并在控制器中提供两个可用的接口方法? 是否有某种设计模式可以很好地解决这个问题?
public interface ISearchService{
Task<List<Search>> GetSearches(int userId);
Task DeleteSearch(int id);
}
public class SearchService : ISearchService {
private IRepository _repository;
public SearchService(IRepository repository){
_repository = repository;
}
public async Task<List<Search>> GetSearches(int userId){
return await _repository.GetUserSearches(userId);
}
public async Task DeleteSearch(int id){
await _repository.DeleteSearch(id);
}
}
public interface ISalesSearchService{
Task<SearchResultReport> GetSalesSearchResults(Search search);
}
public class SalesSearchService : SearchService, ISalesSearchService{
public ISalesSearchRepository _salesRepository;
public SalesSearchService(IRepository repository, ISalesSearchRepository salesRepository) : base(repository){
_salesRepository = salesRepository;
}
public async Task<SearchResultReport> GetSalesSearchResults(Search search){
return _salesRepository.GetSalesSearchResults(search);
}
}
public interface ICustomerSearchService{
Task<SearchResultReport> GetCustomerSearchResults(Search search);
}
public class CustomerSearchService : SearchService, ISalesSearchService{
public ICustomerSearchRepository _customerRepository;
public SalesSearchService(IRepository repository, ICustomerSearchRepository customerRepository) : base(repository){
_customerRepository = customerRepository;
}
public async Task<SearchResultReport> GetCustomerSearchResults(Search search){
return _customerRepository.GetCustomerSearchResults(search);
}
}
public class CustomerSearchController : Controller {
private ICustomerSearchService _customerSearchService;
public CustomerSearchController(ICustomerSearchService customerSearchService){
_customerSearchService = customerSearchService;
}
public async Task Delete(int id){
await _customerSearchService.Delete(1);
}
public async Task<IActionResult> GetSearchResults(int id){
var searches = await _customerSearchService.GetSearches(_userId);
var search = searches.FirstOrDefault(x => x.Id == id);
var results = await _customerSearchService.GetCustomerSearchResults(search);
return View(results);
}
}
在接口中使用继承。
ICustomerSearchService : ISalesSearchService
和
ISalesSearchService : ISearchService