Dependency injection .Net核心DI与ISP一起使用Func

Dependency injection .Net核心DI与ISP一起使用Func,dependency-injection,solid-principles,Dependency Injection,Solid Principles,嗨,我在两个服务之间使用一个公共接口。最初,ServiceA和ServiceB两个服务之间的接口是通用的,但随着它的发展,我意识到ServiceB不需要接口中所有可用的方法,所以我想采用ISP 以前(当我使用公共接口时),很容易注入DI,并根据从api传递的一些参数决定在运行时使用接口的哪个具体实现。 下面是我以前基于ServiceProvider进行此操作的示例。ServiceA和ServiceB使用公共接口,因此在MyRepo中,我可以轻松地调用该方法,而不必担心是谁在实现它 Statrtu

嗨,我在两个服务之间使用一个公共接口。最初,ServiceA和ServiceB两个服务之间的接口是通用的,但随着它的发展,我意识到ServiceB不需要接口中所有可用的方法,所以我想采用ISP

以前(当我使用公共接口时),很容易注入DI,并根据从api传递的一些参数决定在运行时使用接口的哪个具体实现。 下面是我以前基于ServiceProvider进行此操作的示例。ServiceA和ServiceB使用公共接口,因此在MyRepo中,我可以轻松地调用该方法,而不必担心是谁在实现它

Statrtup.cs

services.AddSingleton();
services.AddSingleton();
services.AddTransient(serviceProvider=>key=>
{
开关(钥匙)
{
案例服务提供商。A:
返回serviceProvider.GetService();
案例服务提供商。B:
返回serviceProvider.GetService();
违约:
抛出新的KeyNotFoundException();
}
});
公共接口IServiceA:IBaseService
{
任务GetShoppingMethodsAsync(
ShoppingMethods请求请求、取消令牌取消令牌);
任务GetTrolleySync(
电车请求请求,取消令牌取消令牌);
}
公共接口IServiceB:IBaseService
{
任务GetShoppingMethodsAsync(
ShoppingMethods请求请求、取消令牌取消令牌);
任务GetTrolleySync(
电车请求请求,取消令牌取消令牌);
}
公共类MyRepo{
专用只读功能服务;
公共MyRepo(
IMapper映射器,iPaymentOptions服务付款选项服务,
Func服务)
{
_服务=服务;
}
公共异步任务服务(提供程序p)
{
var resp=wait_服务(P).GetShoppingMethodsAsync(myrequest);
}
}
上述方法的问题是,如果我想应用ISP,那么在ConsumerService中,我需要在调用它的方法之前知道它是哪种接口类型,为此,我需要进行如下检查和强制转换

公共类MyRepo{
专用只读功能服务;
公共MyRepo(
IMapper映射器,iPaymentOptions服务付款选项服务,
Func服务)
{
_服务=服务;
}
公共异步任务服务(提供程序p)
{
var getService=_service(P);
如果(getService是IServiceA serviceA)
{
var resp=等待服务a.GetShoppingMethodsAsync(myrequest);
}
}
}
公共类服务A:IServiceA
{
公共任务GetShoppingMethodsAsync(
ShoppingMethodsRequest请求,CancellationToken CancellationToken){}
公共任务GetTrolleySync(
TrolleyRequest请求,CancellationToken CancellationToken){}
}
公共类服务B:IServiceB
{
公共任务进程异步(
请求请求,CancellationToken CancellationToken){}
}

有没有其他方法来处理这个问题,或者我可以直接从DI返回casted服务。谢谢

您的问题无法回答,因为答案取决于应用程序设计的许多细节,而您没有提供这些细节。但就坚实的原则而言,
MyRepo
可能违反利斯科夫替代原则。您可以尝试将
IServiceA
直接注入到
MyRepo
中。感谢Steven,很抱歉没有提供足够的详细信息,我已经编辑了原始帖子来详细解释问题,请告诉我您还需要什么样的详细信息。将IServceA直接注入MyRepo的问题是,它需要事先知道决定接口具体实现的额外参数。我倾向于做一个普通的电话。请告知。谢谢