我向用户公开的旧版界面是:
public interface IReporter
{
void Write(int site, DateTime start, DateTime end);
}
现在我想替换函数中的参数,如下所示:
public interface IReporter
{
void Write(int site, SiteLocalDateTime start, SiteLocalDateTime end);
}
我希望现有客户使用旧方法和新客户来使用新方法。
有关如何通过暴露单一界面来实现这一目标的想法吗?
选项:
与IReporter
和IReporterNew : IReporter
保持两个界面
现在我所有的新实现都需要使用这两种方法。
无法公开两个界面。
答案 0 :(得分:9)
如果方法的实现在您的最后,您可以将接口组合到一个中。用户可以决定使用哪个。 (最好将旧方法标记为过时,谢谢3dd)
public interface IReporter
{
[Obsolete]
void Write(int site, DateTime start, DateTime end);
void Write(int site, SiteLocalDateTime start, SiteLocalDateTime end);
}
如果这不是您所追求的,您实际上应该对您的软件进行版本控制。新客户的一个版本,一个版本的遗产'为现有客户构建。最终,您可以将旧客户迁移到新版本。
如果已知实际的实现类型,您甚至可以创建conversion between the two types,但我不确定在这种情况下这是否有用。
另外,您的意思是使用DateTimeOffset
代替SiteLocalDateTime
吗?
答案 1 :(得分:1)
在维护公共API时,这始终是一个可能的问题。你不能(或者至少真的不应该删除任何公开的东西。
处理此问题的一种常见方法是添加新接口并将旧接口标记为已弃用,警告新客户不要使用它,因为将来不会支持它。
您也可以执行类似操作并保留旧接口,但使用新签名(普通旧重载)公开新方法。这也可以将旧方法标记为已弃用。
理论上可以在下一个版本中完全删除旧的接口/方法,但这当然会破坏客户端代码。在大多数情况下,这是不值得的。