3
votes

I'm using the WCF REST Template where services are implemented with just a class and registered in the Global.ascx (much like MVC controllers are).

RouteTable.Routes.Add(new ServiceRoute("Games/Games", new WebServiceHostFactory(), typeof(Games.Games)));

Games.Games has a ctor accepting a Dal.Games.IGames and I have a NinjectModule with the Bindings ready but I cant for the life of me figure out where to pass the kernel to to have it control the creation of the service classes.

My services dont have a markup (svc) file so I'm guessing that it will have something do with replacing the WebServiceHostFactory with one from Ninject. I was able to find one in the Ninject Web extension but just dropping that in didnt change anything not to mention I coulnt find anywhere to setup the kenel in that class.

Any solutions, hints or tips are greatly appreciated.

1
The latest source now has an example of using Ninject with the WCF REST Template for VS2010/.NET 4.0. I also posted an example of this for 2.2 here: github.com/chafey/Ninject-2.2-Wcf-Rest-ExampleChris Hafey
Thanks @ChrisHafey! Simple and concise example. +1Ross Hambrick

1 Answers

4
votes

Let me preface this by saying, someone who actually knows inner workings of Ninject could probably provide a much cleaner solution. I've been wrestling with the same issue as you mentioned though.

Mostly through trial & error I determined that if you make the following code changes in the Ninject.Extensions.Wcf library, Ninject will work its magic on your service classes.

In NinjectServiceHostFactory.cs, i changed the base class and the type passed to .Get<T>

public class NinjectServiceHostFactory : WebServiceHostFactory //<-- Changed base class
{
    protected override ServiceHost CreateServiceHost( Type serviceType, Uri[] baseAddresses )
    {
        var serviceTypeParameter = new ConstructorArgument( "serviceType", serviceType );
        var baseAddressesParameter = new ConstructorArgument( "baseAddresses", baseAddresses );
        return KernelContainer.Kernel.Get<NinjectServiceHost>( serviceTypeParameter, baseAddressesParameter );
    }
}

In the NinjectServiceHost.cs i changed the base class to WebServiceHost.

Also, I added this reference to both:

using System.ServiceModel.Web;

I'm sure this solution breaks this extension for other WCF service types so hopefully a Ninject guru will come along and provide a real solution.