如何在接口定义中传递类

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

我为继承基础对象的所有实体创建具有通用功能的

BaseService
public class Committee : BaseObject

public interface IBaseService<T> where T : BaseObject
{
}

public class BaseService<T> : IBaseService<T> where T : BaseObject
{
}

注射:

services.AddScoped(typeof(IBaseService<>), typeof(BaseService<>));

然后我这样使用它:

readonly IBaseService<Committee> _committeeService;

但是对于某些实体,它们也继承了基础对象

public class Evaluation : BaseObject
,我需要为每个实体提供一个服务,并带有一些额外的业务逻辑。因此,我创建了一个继承基础服务的特定服务:

public interface IEvaluationService<T> : IBaseService<T> where T : Evaluation
{
}

public class EvaluationService<T> : BaseService<Evaluation>, IEvaluationService<Evaluation>
{
}

注射:

services.AddScoped(typeof(IEvaluationService<>), typeof(EvaluationService<>));

用法是这样的:

readonly IEvaluationService<Evaluation> _evaluationService;

这段代码运行得很好。但我想知道,为什么我使用

<Evaluation>
时必须通过
IEvaluationService<Evaluation>
。为什么我不能像这样使用它:

readonly IEvaluationService _evaluationService;

???

实体

Evaluation
已在
IEvaluationService
定义中传递。 为什么使用时需要再次传递?

有没有办法让这项服务的使用变得简单

readonly IEvaluationService _evaluationService;

c# .net oop dependency-injection interface
1个回答
0
投票

接口是用类型参数声明的

T
:

public interface IEvaluationService<T> : IBaseService<T> where T : Evaluation
{
}

该类型参数是不是可选的。虽然

T
被限制为
Evaluation
,但这仅意味着
T
可能是
Evaluation
Evaluation
 的任何子类型

虽然

IEvaluationService<Evaluation>
肯定有效,但
IEvaluationService<SubEvaluation>
也有效,如果
SubEvaluation : Evaluation

因此,当您像这样声明接口时,您必须声明您对哪个

T
感兴趣。

如果您只想支持

Evaluation
,而不支持它的子类型,您可以像这样声明接口:

public interface IEvaluationService : IBaseService<Evaluation>
{
    // More members here..?
}

这将使您能够将其用作

IEvaluationService
,因为该类型没有开放的泛型。

© www.soinside.com 2019 - 2024. All rights reserved.