C# 类如何继承基类和接口,并通过 IOC 解析两个类的接口?

问题描述 投票:0回答:1

这都是快速输入的伪代码来说明问题。 我有一个实现接口的基类。 然后,我在两个子类中继承该类,这两个子类实现了自己的接口。 最后,我将其中一个子类注入到控制器中。

我的希望是可以调用基类的

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);
    }
}
c#
1个回答
2
投票

在接口中使用继承。

 ICustomerSearchService : ISalesSearchService

 ISalesSearchService : ISearchService
© www.soinside.com 2019 - 2024. All rights reserved.