How to Use Dependency Injection (Ninject) with WCF Services
I spent a lot of time late last week trying to figure out exactly how to set up dependency injection for a WCF service I was developing on Windows Azure; there’s some documentation out there on how to do it, but it’s not nearly as helpful as I would like it. Thus I decided to document how I made WCF and Ninject play nice with each other, and I even provide a sample template you can use yourself.
Step 1 – Install Ninject.Extensions.WCF via NuGet
The developers who maintain Ninject were kind enough to put together a set of extensions for working with WCF applications specifically, and we can install this via NuGet (install it from CodePlex.)
Simply type this into the “package manager console” in Visual Studio: install-package Ninject.Extensions.Wcf
This will automatically grab the appropriate version of Ninject and the other binaries you’ll need to get the WCF ServiceHost to play nice with your service.
Step 2 – Write Your Own Ninject Module
The next step is to set up your dependency injections by writing your own NinjectModule like this:
using Ninject.Modules; namespace wcf_ninject.DI { public class WCFNinjectModule : NinjectModule { public override void Load() { //Injects the constructors of all DI-ed objects //with a LinqToSQL implementation of IRepository Bind<IRepository>().To<LinqToSQLRepository>(); } } }
Step 3 – Add the “Factory” Attribute to Service1.svc
The next thing you need to do is tell the service host to use the Ninject Factory to instantiate the WCF service by way of a custom ServiceHostFactory included in the Ninject WCF Extensions.
To do this, right click on the “Service1.svc” file (or whatever you name your service) and select the “View Markup” option:
Once there, simply add this line:
Before
<%@ ServiceHost Language="C#" Debug="true" Service="wcf_ninject.Service1" CodeBehind="Service1.svc.cs" %>
After
<%@ ServiceHost Language="C#" Debug="true" Service="wcf_ninject.Service1" CodeBehind="Service1.svc.cs" Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %>
Step 4 – Add Global.asax Make It Inherit from NinjectWcfApplication
The final step is to add a Global.asax file to your WCF project and make it inherit from the NinjectWcfApplication class, like this:
public class Global : NinjectWcfApplication
In order for this code to compile, you’ll need to add a “CreateKernel” method to Global.asax – this method is what utilizes your Ninject module and uses it to inject dependencies into your WCF service. Here’s what that code looks like for this example:
protected override IKernel CreateKernel() { return new StandardKernel(new WCFNinjectModule()); }
Now there’s just one last step…
Step 5 – Remove the Default Constructor from Your WCF Service; Have Dependency-Accepting Constructor Instead
Your final constructor in this example should look something like this:
public Service1(IRepository repository) { _repo = repository; }
Get rid of any default constructors (ones that don’t accept arguments) – Ninject will raise an error if it finds one in the signature of your class as of writing this.
Grab the WCF + Ninject Visual Studio 2010 Project off of Github
You can download the Visual Studio 2010 project that contains this WCF + Ninject sample off of Github if you want to use it as a starting point.