接口版本控制中的问题



我向用户展示的旧版本的界面是这样的:

public interface IReporter
{
    void  Write(int site, DateTime start, DateTime end);
} 

现在我想替换函数中的参数如下:

public interface IReporter
{
    void  Write(int site, SiteLocalDateTime start, SiteLocalDateTime end);
}

我希望现有客户使用旧方法,新客户使用新方法。

关于如何通过暴露单个接口来实现这一点的任何想法?

选项:

  1. IReporterIReporterNew : IReporter保持两个接口现在我所有的新实现都需要使用这两种方法。

  2. 不允许暴露两个接口

如果方法的实现在您的端,则可以将这些接口合并为一个。用户可以决定使用哪一种。(最好将旧方法标记为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相结合。

当然,理论上可以在下一个版本中完全删除旧的接口/方法,但这当然会破坏客户端代码。在大多数情况下,这是不值得的。

最新更新