界面版本控制中的问题

时间:2015-07-28 10:21:39

标签: c# .net interface

我向用户公开的旧版界面是:

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. 无法公开两个界面。

2 个答案:

答案 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时,这始终是一个可能的问题。你不能(或者至少真的不应该删除任何公开的东西。

处理此问题的一种常见方法是添加新接口并将旧接口标记为已弃用,警告新客户不要使用它,因为将来不会支持它。

您也可以执行类似操作并保留旧接口,但使用新签名(普通旧重载)公开新方法。这也可以将旧方法标记为已弃用。

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