Search code examples
c#wcfwcf-binding

WCF: Using my "custom" ServiceHost in my app.config/web.config for my wcf service?


I have a created a simple Custom ServiceHost that inherits from ServiceHost and overrides the method InitializeRuntime.

How do i change my app.config / web.config to use the custom service host so my overriden InitializeRunTime is executes..

I see attributes in the config file like behaviorConfiguration etc but nothing obvious where i can force it to use my Custom ServiceHost

My ServiceHost is simple :-

public class UnityServiceHost : ServiceHost
{
    protected override void InitializeRuntime()
    {

        //DO MY UNITY INJECTION HERE 
        //Console.WriteLine("");
        base.InitializeRuntime();
    }


}

Any help really appreciated.

Thanks


Solution

  • Oran Dennison describes how to do this using Spring.NET: http://orand.blogspot.com/2006/10/wcf-service-dependency-injection.html

    In summary, you'll use WCF's "behavior injection" to supply an instance of the service created by your DI container.

    1) Create custom IInstanceProvider implementation with the GetInstance method returning the service object created by your container:

        public object GetInstance(InstanceContext instanceContext, Message message)
        {
            return _container.Resolve(_serviceType);
        }
    

    2) Implement a custom IServiceBehaviour that adds your custom IInstanceProvider to each endpoint configuration.

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
            {
                ChannelDispatcher cd = cdb as ChannelDispatcher;
                if (cd != null)
                {
                    foreach (EndpointDispatcher ed in cd.Endpoints)
                    {
                        ed.DispatchRuntime.InstanceProvider = 
                            new YourCustomInstanceProvider(serviceDescription.ServiceType);
                    }
                }
            }
        }
    

    3) In your custom service host, override OnOpening and add your custom service behavior

        protected override void OnOpening()
        {
            this.Description.Behaviors.Add(new CustomServiceBehavior());
            base.OnOpening();
        }
    

    Note that you may have to pass down your UnityContainer instance through to the IInstanceProvider so that it can do the resolving.