ColonelPanic

Ninject WCF Service Host

Aug 9th, 2011
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.42 KB | None | 0 0
  1. public class NinjectServiceHost<T> : ServiceHost
  2. {
  3.     private readonly IKernel kernel;
  4.  
  5.     public NinjectServiceHost(IKernel kernel, params Uri[] baseAddresses) : base(typeof(T), baseAddresses)
  6.     {
  7.         if (kernel == null)
  8.         {
  9.             throw new ArgumentException("Ninject kernel must be provided.");
  10.         }
  11.  
  12.         this.kernel = kernel;
  13.     }
  14.  
  15.     protected override void OnOpening()
  16.     {
  17.         Description.Behaviors.Add(new NinjectInstanceProviderBehaviorAttribute(new NinjectInstanceProvider<T>(kernel)));
  18.         base.OnOpening();
  19.     }
  20. }
  21.  
  22. internal class NinjectInstanceProviderBehaviorAttribute : Attribute, IServiceBehavior
  23. {
  24.     private readonly IInstanceProvider instanceProvider;
  25.  
  26.     public NinjectInstanceProviderBehaviorAttribute(IInstanceProvider instanceProvider)
  27.     {
  28.         this.instanceProvider = instanceProvider;
  29.     }
  30.  
  31.     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
  32.     {
  33.         foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
  34.         {
  35.             foreach (EndpointDispatcher ed in cd.Endpoints)
  36.             {
  37.                 if (!ed.IsSystemEndpoint)
  38.                 {
  39.                     ed.DispatchRuntime.InstanceProvider = instanceProvider;
  40.                 }
  41.             }
  42.         }
  43.     }
  44.  
  45.     public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { }
  46.     public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
  47. }
  48.  
  49. internal class NinjectInstanceProvider<T> : IInstanceProvider
  50. {
  51.     private readonly IKernel kernel;
  52.  
  53.     public NinjectInstanceProvider(IKernel kernel)
  54.     {
  55.         this.kernel = kernel;
  56.     }
  57.  
  58.     public object GetInstance(System.ServiceModel.InstanceContext instanceContext, System.ServiceModel.Channels.Message message)
  59.     {
  60.         return GetInstance(instanceContext);
  61.     }
  62.  
  63.     public object GetInstance(System.ServiceModel.InstanceContext instanceContext)
  64.     {
  65.         return kernel.Get<T>();
  66.     }
  67.  
  68.     public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, object instance)
  69.     {
  70.         IDisposable disposable = instance as IDisposable;
  71.         if (disposable != null)
  72.         {
  73.             disposable.Dispose();
  74.         }
  75.     }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment