我有6家不同商店的客户服务,3种不同的商店系统apis,所以我在我的项目中有3个libs
喜欢
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
现在我需要调用一个函数,比如
contractService.getContracts();用我的界面
public interface IContractService
{
List<ContractData> GetContracts()
}在每个Lib中,我有一个类,如
public Shopsystem1ContractService : IContractService {
List<ContractData> GetContracts(){...}
}
public Shopsystem2Contractservice : IContractService {
List<ContractData> GetContracts(){...}
}
public Shopsystem3ContractService : IContractService {
List<ContractData> GetContracts(){...}
}但现在我需要这样的东西:
public Shopsystem1ContractService : IContractService {
List<Shopsystem1ContractData> GetContracts(){...}
}
public Shopsystem2ContractService : IContractService {
List<Shopsystem2ContractData> GetContracts(){...}
}
public Shopsystem3contractservice : IContractservice {
List<Shopsystem3ContractData> GetContracts(){...}
}更新:
现在,我根据juharr和Julius使用了一个通用接口:
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:
ioc.Register<IContractService<Shopsystem1ContractData>, Shopsystem1contractservice>();
ioc.Register<IContractService<Shopsystem2ContractData>, Shopsystem2contractservice>();
ioc.Register<IContractServic<Shopsystem3ContractData>, Shopsystem2contractservice>(); 但是如何在我的ContractController中实现这一点呢?
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中有控制器,但只用于显式端点。
发布于 2019-06-19 13:19:06
这看起来像是仿制药的例子。
您应该使IContractservice成为通用的。如下所示:
interface IContractservice<TContract> where TContract : ContractData
{
List<TContract> GetContracts();
}因此,传入的泛型类型必须从where派生出来。
然后,您可以这样实现它:
class Shopsystem1contractservice : IContractservice<Shopsystem1contractData>
{
public List<Shopsystem1contractData> GetContracts()
{
}
}让我们谈谈您的编辑:
在目前的情况下,我认为你不能这么做。你是正确的,没有办法知道哪三个应该注射。这就是为什么你应该做以下事情之一:
IContractservice<Shopsystem1contractData>。IContract<ContractData>注册某种类型,而不是更显式的类型。这两者都可能破坏了你的系统,那么你为什么要这样做呢?您将始终需要一种方式选择其中之一,你可以(在第2点中提到)注册一个使用,如果要求一般的一个。
我认为这样做最有意义:
ioc.Register<IContract<ContractData>, Shopsystem2contractservice>(); 您注册的其他三件事都是多余的,因为您目前似乎只有一个IContract<Shopsystem1ContractData>的实现,等等。但是,您确实有多个IContract<ContractData>实现,所以应该注册。
您还应该能够注册ContractData,所以每次您请求ContractData时,都会使用您定义的ContractData(例如。Shopsystem1contractData)。
在您的设计中有一个缺陷,所以很难确定哪一个是您的案例的正确解决方案。
https://stackoverflow.com/questions/56668467
复制相似问题