假设我有以下类和接口的结构:
interface IService {}
interface IEmailService : IService
{
Task SendAsync(IMessage message);
}
class EmailService : IEmailService
{
async Task SendAsync(IMessage message)
{
await ...
}
}
interface ICircuitBreaker<TService> : IService where TService : IService
{
TService Service { get; set; }
Task<IResult> PerformAsync(Func<Task<Iresult>> func);
}
class EmailServiceCircuitBreaker : ICircuitBreaker<IEmailService>
{
IEmailService Service { get; set; }
public EmailServiceCircuitBreaker(IEmailService service)
{
Service = service;
}
public async Task<IResult> PerformAsync(Func<Task<Iresult>> func)
{
try
{
func();
}
catch(Exception e){//Handle failure}
}
}
现在我想将EmailServiceCircuitBreaker
更改为:
class EmailServiceCircuitBreaker : ICircuitBreaker<IEmailService>, IEmailService
这样我就可以包装IEmailService
中的每个方法,Send(...)
将会变成:
async Task<IResult> IEmailService.SendAsync(IMessage m)
=> await PerformAsync(async () => await Service.SendAsync(m));
在控制器中,即使这是 ICircuitBreaker<IEmailService>
,我仍然可以将其用作 IEmailService
,而无需知道它的具体内容。
但是,如果我的任何同事要实现 ICircuitBreaker<T>
,我希望强制他的类也实现 T
。
interface IInterface<T> : IService where IService : T
这部分语法不正确,类型约束必须放在类型参数上。 - Codor