Ганс, вы все правильно поняли, но я заменю ваши InitializeServices (); со следующим кодом.
Это псевдокод, поэтому вам нужно заменить биты:)
1) Настройте свои конечные точки в app.config
2) Получите типы ваших сервисов из вашего сервисного проекта \ сборки
Dictionary<Type, Type> mappings = new Dictionary<Type,Type>();
foreach (Type t in MyServiceAssembly.GetTypes())
{
if (t.GetInterfaces().Length > 0)
{
foreach (Type ti in t.GetInterfaces())
{
if (mapping.ContainsKey(ti))
System.Diagnostics.Debug.WriteLine("Class {0} implements more than one interface {1}", t.FullName, ti.FullName);
else
mapping.Add(ti, t);
// System.Diagnostics.Debug.WriteLine("Class {0} implements {1}", t.FullName, ti.FullName);
}
}
}
4) Если вы хотите контролировать конечные точки из app.config Теперь итерируйте свои конечные точки и получите соответствующую реализацию сервиса, затем создайте ваши хосты
// читать ваши конечные точки при запуске службы
List<ServiceHost> serviceHosts = new List<ServiceHost>();
ServicesSection servicesSection = (ServicesSection)WebConfigurationManager.GetSection("system.serviceModel/services");
for(int i = 0;i<servicesSection.Services.Count;i++)
{
ServiceEndpointElement endpoint = servicesSection.Services[i].Endpoints[0];
string url = string.Format("net.tcp://{0}:{1}/YouNameSpace_service_Name_From_EndPoint/{2}.svc","YourHost","YourPort");
ServiceHost serviceHost = new ServiceHost(mappings[endpoint.Contract] , new Uri(url));
serviceHost.Open();
mServiceHosts.Add(serviceHost);
}
5) Если вы не хотите управлять конечными точками из app.config , выполните итерацию по списку сопоставлений.
// сделать это при запуске службы
List<ServiceHost> serviceHosts = new List<ServiceHost>();
foreach(type t in mappings.Keys)
{
string url = string.Format("net.tcp://{0}:{1}/YouNameSpace_{2}.svc","YourHost","YourPort",t.name);
ServiceHost serviceHost = new ServiceHost(mappings[t] , new Uri(url));
serviceHost.Open();
mServiceHosts.Add(serviceHost);
}