flush
[mcs.git] / class / System.ServiceModel.Routing / System.ServiceModel.Routing / RoutingExtension.cs
blob2c0782ec15a73bd8db372d041c1707e77885a4d4
1 using System;
2 using System.Collections.Generic;
3 using System.Collections.ObjectModel;
4 using System.ServiceModel;
5 using System.ServiceModel.Channels;
6 using System.ServiceModel.Description;
7 using System.ServiceModel.Dispatcher;
9 namespace System.ServiceModel.Routing
11 public sealed class RoutingExtension : IExtension<ServiceHostBase>
13 class InstanceProvider : IInstanceProvider
15 public InstanceProvider (RoutingConfiguration config)
17 this.config = config;
20 RoutingConfiguration config;
22 public object GetInstance (InstanceContext instanceContext)
24 return new RoutingService () { Configuration = config };
27 public object GetInstance (InstanceContext instanceContext, Message message)
29 return GetInstance (instanceContext);
32 public void ReleaseInstance (InstanceContext instanceContext, object instance)
37 internal RoutingExtension ()
41 ServiceHostBase host;
42 RoutingConfiguration configuration;
44 public void ApplyConfiguration (RoutingConfiguration routingConfiguration)
46 if (routingConfiguration == null)
47 throw new ArgumentNullException ("routingConfiguration");
48 configuration = routingConfiguration;
50 if (host == null)
51 return;
53 host.Opened += delegate {
54 foreach (ChannelDispatcher cd in host.ChannelDispatchers)
55 foreach (var ed in cd.Endpoints)
56 if (ed.ContractNamespace == "http://schemas.microsoft.com/netfx/2009/05/routing")
57 ed.DispatchRuntime.InstanceProvider = new InstanceProvider (configuration);
61 void IExtension<ServiceHostBase>.Attach (ServiceHostBase owner)
63 host = owner;
64 if (configuration != null)
65 ApplyConfiguration (configuration);
68 void IExtension<ServiceHostBase>.Detach (ServiceHostBase owner)
70 host = null;