【发布时间】:2017-08-11 13:51:43
【问题描述】:
假设我有这样的类和接口结构:
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));
在控制器中,我可以将其用作IEmailService,即使这是ICircuitBreaker<IEmailService>,但我并不知道。
但是,如果我的任何同事将实施ICircuitBreaker<T>,我想强制他的班级也实施T
【问题讨论】:
-
描述似乎有点倒退,但您是否试图描述类似于 Eric Lippert 的Curiouser and Curiouser 中描述的场景?
-
问题到底是什么?
interface IInterface<T> : IService where IService : T部分语法不正确;类型约束必须在类型参数上。 -
据我所知 C# 不支持这种约束,如果你不希望你的所有团队成员都遵守严格的规则,你可以使用 Roslyn 编译器的功能
-
@Codor 是的,我知道这是不正确的
-
@VibeeshanRC 你能提供一些关于这个话题的链接吗?
标签: c# .net generics inheritance interface