I have started writing my own WebDAV server class in .NET, and the first class I'm starting with is a WebDAVListener
class, modelled after how the HttpListener
class works.
Since I don't want to reimplement the core http protocol handling, I will use HttpListener
for all its worth, and thus I have a question.
What would the suggested way be to handle this:
- Implement all the methods and properties found inside HttpListener, just changing the class types where it matters (ie. the GetContext + EndGetContext methods would return a different class for WebDAV contexts), and storing and using a
HttpListener
object internally - Construct WebDAVListener by passing it a HttpListener class to use?
- Create a wrapper for HttpListener with an interface, and constrct WebDAVListener by passing it an object implementing this interface?
If going the route of passing a HttpListener (disguised or otherwise) to the WebDAVListener, would you expose the underlying listener object through a property, or would you expect the program that used the class to keep a reference to the underlying HttpListener
?
Also, in this case, would you expose some of the methods of HttpListener
through the WebDAVListener
, like Start and Stop, or would you again expect the program that used it to keep the HttpListener
reference around for all those things?
My initial reaction tells me that I want a combination. For one thing, I would like my WebDAVListener
class to look like a complete implementation, hiding the fact that there is a HttpListener
object beneath it.
On the other hand, I would like to build unit-tests without actually spinning up a networked server, so some kind of mocking ability would be nice to have as well, which suggests I would like the interface-wrapper way.
One way I could solve this would be this:
public WebDAVListener()
: WebDAVListener(new HttpListenerWrapper())
{
}
public WebDAVListener(IHttpListenerWrapper listener)
{
}
And then I would implement all the methods of HttpListener (at least all those that makes sense) in my own class, by mostly just chaining the call to the underlying HttpListener object.
What do you think?
Final question: If I go the way of the interface, assuming the interface maps 1-to-1 onto the HttpListener class, and written just to add support for mocking, is such an interface called a wrapper or an adapter?