我为继承基础对象的所有实体创建具有通用功能的
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;
?
接口是用类型参数声明的
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
,因为该类型没有开放的泛型。