I have WCF services structured like suggested by Miguel Castro. This means that I have set everything up manually, and have a console application hosting my services using ServiceHost objects.
I want to keep my service classes thin, and they are currently just passing on calls to behavior classes. My problem now is unit testing the service classes. I want to inject something to the classes as a constructor parameter such that I can mock this away and write proper isolated unit tests. The ServiceHost class doesn’t seem to accept arguments, so my question is how I can inject data to the service classes – or can’t I?
WCF supports Constructor Injection, but you have to jump through a few hoops to get there. The key lies in writing a custom ServiceHostFactory. While that, too, must have a default constructor, you can use it to wire up all the correct behaviors.
As an example, I recently wrote one that uses Castle Windsor to wire up dependencies for the service implementation. The implementation of CreateServiceHost simply does this:
where
this.containeris a configured IWindsorContainer.WindsorServiceHost looks like this:
and WindsorInstanceProvider looks like this:
This may look like a lot, but notice that it’s reusable, general-purpose code that has a rather low cyclomatic complexity.
You can follow the same coding idiom to implement Dependency Injection with another DI Container or by using Poor Man’s DI.
Here’s an older writeup of this idiom that uses Poor Man’s DI.