我向用户展示的旧版本的界面是这样的:
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
保持两个接口现在我所有的新实现都需要使用这两种方法。不允许暴露两个接口
如果方法的实现在您的端,则可以将这些接口合并为一个。用户可以决定使用哪一种。(最好将旧方法标记为obsolete,谢谢3dd)
public interface IReporter
{
[Obsolete]
void Write(int site, DateTime start, DateTime end);
void Write(int site, SiteLocalDateTime start, SiteLocalDateTime end);
}
如果这不是你想要的,你应该对你的软件进行版本化。一个版本用于新客户,一个"遗留"版本用于现有客户。最终你可以将老客户迁移到新版本。
如果实际实现的类型是已知的,你甚至可以创建两个类型之间的转换,但我不确定在这种情况下是否有用。
另外,您的意思是使用DateTimeOffset
而不是SiteLocalDateTime
吗?
在维护公共api时,这总是一个可能的问题。你不能(或者至少真的不应该)删除任何已经公开的东西。
处理这个问题的一种常见方法是添加一个新接口,并将旧接口标记为已弃用,警告新客户不要使用它,因为将来它将不被支持。
您也可以做类似的事情并保留旧接口,但使用新签名公开新方法,即普通的旧重载。这也会与将旧方法标记为deprecated相结合。
当然,理论上可以在下一个版本中完全删除旧的接口/方法,但这当然会破坏客户端代码。在大多数情况下,这是不值得的。