【问题标题】:Adding methods to existing class - inheritance/injection向现有类添加方法 - 继承/注入
【发布时间】:2014-01-15 17:01:12
【问题描述】:

我有十几个为 WCF 构建的服务类,例如:

 public class BookingService : IBookingService
 {
        public void BookTheThing(int ThingID) { .. }
 }

我们的目标是将这些类作为直接库(而不是 WCF)重用,并创建一个单独的服务库,以便我们保留和公开这些现有方法并添加新方法。以下是我根据有限的经验提出的两种可能性:

*Option#1 - 注入原始类并创建相同的方法来公开它的功能:

public class BookingServiceNew : IBookingServiceNew
{
    public BookingServiceNew(IBookingService service) { _baseService = service; } 
    public void BookTheThing(int ThingId) { _baseService.BookTheThing(ThingId); }

    public bool OurNewMethod1(int ThingId) { return true; }
    public int OurNewMethod2(int ThingId) { return 1; }

}

*Option#2 - 继承原始服务类,它会自动将其方法公开为类的一部分,然后添加我们自己的东西

public class BookingServiceNew : BookingService, IBookingServiceNew
{
    public bool OurNewMethod1(int ThingId) { return true; }
    public int OurNewMethod2(int ThingId) { return 1; }
}

选项#1 似乎会有更多的代码和重复,必须为实现和接口中的每个方法创建一个存根。选项#2 似乎在客户端的依赖注入方面可能存在一些问题,其中针对 IBookingServiceNew 只会提供对 OurNewMethod1 和 OurNewMethod2 的访问。 同样,我提供的这些选项是基于我非常有限的经验,我希望您能就更好的方法/实践/模式提出想法和建议。

谢谢

【问题讨论】:

  • 您介意评论一下为什么“与IBookingServiceNew 合作只会提供对OurNewMethod1 的访问权限...”吗? (假设interface IBookingServiceNew : IBookingService)?

标签: c# wcf design-patterns


【解决方案1】:

我建议使用选项 1(组合)而不是继承。是的,这需要额外的样板代码来公开内部服务的每个方法。然而,这段代码没有逻辑,所以我们并没有真正“重复”任何东西。此外,通过使用组合,您可以获得很大的灵活性;如果您决定不想在 IBookingServiceNew 中公开与 IBookingService 相同的接口,您可以简单地删除/更改这些方法,而无需修改原始 BookingService 实现。您还可以轻松地换入 IBookingService 的新实现(例如单元测试中的模拟)。

相比之下,使用类继承来避免样板代码在短期内会节省一些代码,但会大大降低灵活性和维护成本。一方面,您放弃了将来扩展不同基类的能力。现在,您的 BookingService 类必须为继承而设计;您必须小心哪些内部方法和状态暴露给子类,并且您需要担心与派生类中的方法发生冲突。通常,您希望扩展的类公开的 API 比接口公开的 API 更复杂,消费者更难理解。作为一般规则,我尽量避免使用类继承,除非我实际上会使用多态性(而不是仅仅包含来自基类的方法)。在这种情况下,您已经在使用接口,因此您不需要类多态。

最后,请注意,您对 IBookingServiceNew 未在 IBookingService 上公开方法的担忧很容易解决,方法是 (1) 将这些方法也放在 IBookingServiceNew 上,或者 (2) 让 IBookingServiceNew 扩展 IBookingService。

【讨论】:

  • 不叫作曲吗?组合优于继承?
  • @Fendy:不知道我在想什么。我已经改了。
【解决方案2】:

extension methods 呢?

public static class BookingServiceExtensions
{
   public static bool OurNewMethod1(this IBookingService service, int ThingId)
   {
       ...
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 2014-02-25
    • 1970-01-01
    • 2022-09-23
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多