Previously I gave a simple overview of hosting a single services in a form. If you’re developing a larger system and you have broken down business across several services, for reasons ranging from code management, to partitioning development tasks across teams, to reducing the compile time for a visual studio solution. You’re likely to want to keep the services separate but kick them off in groups; “Core System Services”, “Supporting Services”, “Reporting/Administration Services”, etc.
The most manual part is to merge the endpoints from all your individual config files into 1 single App.Config file that will accompany your production level deployment approach. This can also be used to package up the initial services mid-way through development when they are unlikely to change and it saves hassle running them as a group.
Watch-out-for: the contract definition in the config file; make sure it’s a fully qualified namespace for each service end point. You add individual references to your host application for each service you’re including.
<endpoint address="net.tcp://localhost:8001/Patients" binding="netTcpBinding" bindingConfiguration="myNetTcpBinding" contract="Server.Patient.IPatientServiceContract" />
For this example I’ve simply chosen to run it as a standard windows service, where all I need to do is implement OnStart() and OnStop() and if you think you need to OnPause() and OnContinue() or any of the other ServiceBase methods.
public partial class MultiServiceHost : ServiceBase { private IList<ServiceHost> hosts = new List<ServiceHost>(); }
The OnStart() is simply a list of each of your services you’re grouping to run together.
protected override void OnStart(string[] args) { try { hosts.Add(new ServiceHost(typeof(PatientService))); hosts.Add(new ServiceHost(typeof(MedicalProcedureService))); hosts.Add(new ServiceHost(typeof(OtherService))); //more hosts... StartServices(); } //Catch ()... }
A loop to kick off all the services, that’s called after they’re all added.
private void StartServices() { foreach (ServiceHost h in hosts) { h.Open(); } }
Closing them all off upon shutdown of the host.
protected override void OnStop() { foreach (ServiceHost host in _hosts) { if (host != null) host.Close(); } }
It’s that simple.