首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口使用3个不同的返回值。

接口使用3个不同的返回值。
EN

Stack Overflow用户
提问于 2019-06-19 13:09:58
回答 1查看 72关注 0票数 0

我有6家不同商店的客户服务,3种不同的商店系统apis,所以我在我的项目中有3个libs

喜欢

代码语言:javascript
复制
Shopsytem 1 -> (Lib1)
Shop A
Shop B
Shop C

Shopsystem 2 -> (Lib2)
Shop D
Shop E

Shosystem 3 -> (Lib3)
Shop F

我在Lib1中有一个"Contactcontroller“,Lib2/Lib3继承自Lib1

现在我需要调用一个函数,比如

代码语言:javascript
复制
contractService.getContracts();

用我的界面

代码语言:javascript
复制
public interface IContractService
{
    List<ContractData> GetContracts()
}

在每个Lib中,我有一个类,如

代码语言:javascript
复制
public Shopsystem1ContractService : IContractService {   
    List<ContractData> GetContracts(){...}
}

public Shopsystem2Contractservice : IContractService {
    List<ContractData> GetContracts(){...}    
}

public Shopsystem3ContractService : IContractService {
    List<ContractData> GetContracts(){...}    
}

但现在我需要这样的东西:

代码语言:javascript
复制
public Shopsystem1ContractService : IContractService {   
    List<Shopsystem1ContractData> GetContracts(){...}
}

public Shopsystem2ContractService : IContractService {
    List<Shopsystem2ContractData> GetContracts(){...}    
}

public Shopsystem3contractservice : IContractservice {
    List<Shopsystem3ContractData> GetContracts(){...}    
}

更新:

现在,我根据juharr和Julius使用了一个通用接口:

代码语言:javascript
复制
    interface IContractService<TContract> where TContract : ContractData
{
     List<TContract> GetContracts();
}

public Shopsystem1ContractService : IContractService<Shopsystem1ContractData>
{   
    List<Shopsystem1ContractData> GetContracts(){...}
}

public Shopsystem2ContractService : IContractService<Shopsystem2ContractData>
{
    List<Shopsystem2ContractData> GetContracts(){...}    
}

public Shopsystem3contractservice : IContractservice<Shopsystem3ContractData>
{
    List<Shopsystem3ContractData> GetContracts(){...}    
}

IoCModule:

代码语言:javascript
复制
    ioc.Register<IContractService<Shopsystem1ContractData>, Shopsystem1contractservice>();
    ioc.Register<IContractService<Shopsystem2ContractData>, Shopsystem2contractservice>();
    ioc.Register<IContractServic<Shopsystem3ContractData>, Shopsystem2contractservice>(); 

但是如何在我的ContractController中实现这一点呢?

代码语言:javascript
复制
private readonly IContractService<ContractData> contract;


        public KontaktController(
            IContractService<ContractData> contract,
        {
            this.contract = contract;
        }

IContractService需要一个类型,它如何知道Shopsystem{1-3}ContractData?

简单的方法是在Lib2和Lib3中创建一个Contractcontroller,但是如果我能够在globallib (lib1)中做到这一点,那就太好了。我在Lib 2和Lib3中有控制器,但只用于显式端点。

EN

回答 1

Stack Overflow用户

发布于 2019-06-19 13:19:06

这看起来像是仿制药的例子。

您应该使IContractservice成为通用的。如下所示:

代码语言:javascript
复制
interface IContractservice<TContract> where TContract : ContractData
{
     List<TContract> GetContracts();
}

因此,传入的泛型类型必须从where派生出来。

然后,您可以这样实现它:

代码语言:javascript
复制
class Shopsystem1contractservice : IContractservice<Shopsystem1contractData>
{
     public List<Shopsystem1contractData> GetContracts()
     {

     }
}

让我们谈谈您的编辑:

在目前的情况下,我认为你不能这么做。你是正确的,没有办法知道哪三个应该注射。这就是为什么你应该做以下事情之一:

  1. 使用更显式的类型注入,例如,在控制器中使用IContractservice<Shopsystem1contractData>
  2. IContract<ContractData>注册某种类型,而不是更显式的类型。

这两者都可能破坏了你的系统,那么你为什么要这样做呢?您将始终需要一种方式选择其中之一,你可以(在第2点中提到)注册一个使用,如果要求一般的一个。

我认为这样做最有意义:

代码语言:javascript
复制
ioc.Register<IContract<ContractData>, Shopsystem2contractservice>(); 

您注册的其他三件事都是多余的,因为您目前似乎只有一个IContract<Shopsystem1ContractData>的实现,等等。但是,您确实有多个IContract<ContractData>实现,所以应该注册。

您还应该能够注册ContractData,所以每次您请求ContractData时,都会使用您定义的ContractData(例如。Shopsystem1contractData)。

在您的设计中有一个缺陷,所以很难确定哪一个是您的案例的正确解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56668467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档