2010-05-02 57 views
4

我已经开始在.NET中编写我自己的WebDAV服务器类,并且我开始的第一个类是WebDAVListener类,模仿HttpListener类的工作方式。请求关于类设计,继承/聚合的建议

由于我不想重新实现核心http协议处理,我将使用HttpListener所有的价值,因此我有一个问题。

什么会建议的方式来处理这个问题:

  • 器里面HttpListener发现,只是改变的地方事务类类型(即的getContext + EndGetContext方法将返回不同的所有方法和属性。 WebDAV上下文类),并在内部存储和使用对象
  • 构造WebDAVListener通过传递一个HttpListener类来使用?
  • 用接口为HttpListener创建包装,并通过传递一个实现此接口的对象来构造WebDAVListener?

如果要传递一个HttpListener(伪装或其他方式)的WebDAVListener的路线,你会通过属性暴露出下面的听众对象,或者你会认为使用类保持到一个参考方案底层HttpListener

而且,在这种情况下,你会揭露一些的HttpListener方法通过WebDAVListener,如启动和停止,或者你会再次想到用它来保持周围的HttpListener参考了所有这些事情的程序?

我最初的反应告诉我,我想要一个组合。首先,我希望我的WebDAVListener类看起来像一个完整的实现,隐藏了它下面有一个HttpListener对象的事实。另一方面,我想建立单元测试,但实际上并没有启动一个网络服务器,所以某种类型的嘲讽能力也不错,这表明我希望采用接口包装的方式。

的一种方式,我可以解决这将是这样的:

public WebDAVListener() 
    : WebDAVListener(new HttpListenerWrapper()) 
{ 
} 

public WebDAVListener(IHttpListenerWrapper listener) 
{ 
} 

然后,我会实现HttpListener的所有方法(至少所有这些是有道理的),在我自己的类,由大多只是链接了调用底层的HttpListener对象。

您认为如何?最后的问题:如果我走的界面的方式,假设接口映射到HttpListener类1,1,并且只是为了添加对模拟的支持而写,是一个叫做包装器或适配器的接口吗?

回答

1

我会先回答你的最后一个问题:一个类是一个适配器,如果它使用与某个ISource匹配的包含对象实现某个ITarget接口 - 一个从ISource到ITarget的适配器。在这种情况下,没有源接口,您正在尝试添加一个接口,所以我将其称为包装器。

我会倾向于

  • 让拥有所有需要为自己的行为方式,在内部使用的HttpListener,并没有公开有关HttpListener任何一个WebDavListener类。

  • 如果当你需要它,使IHttpListenerWrapper和HttpListenerWrapper你的建议,并更改WebDavListener采取的IHttpListenerWrapper在其构造。假设所有的方法都是相同的,这应该是一个简单的搜索和替换。你甚至可以把原来的构造函数放在那里,让它构造一个包装器并调用新的构造器。

  • 如果当你需要它,为它实现一个IWebDavListener,如果你认为你可能想要一个虚拟的WebDAV侦听器来测试其他的东西。

这类设计问题,就是为什么我喜欢重构工具,如ReSharper的:提取接口,创建派生实现等使它更容易使这些类型的改变,这样你就可以少担心是否做这些事现在或以后:-)(假设您可以稍后自由更改来源,当然这取决于您如何交付物品。)