Я могу думать о двух путях - способ 2 будет предпочтительным подходом.
Создайте несколько классов, которые просто наследуются от вашего класса обслуживания. Например,
public class MyService1 : MyService {
... // put a constructor that accepts your object
}
public class MyService2 : MyService { ... }
...
А теперь хост как
MyType o1 = new MyType();
MyService s1 = new MyService1(o1);
ServiceHost host1 = new ServiceHost(s1, anEndpointAddress);
MyType o2 = new MyType();
MyService s2 = new MyService2(s2);
ServiceHost host2 = new ServiceHost(s2, anEndpointAddress);
Если вам не нужен синглтон, вам нужно изменить эти классы, например
public class MyService1 : MyService
{
public MyService1() : base(new MyType()) { }
}
, а затем использовать другой конструктор хоста службы
ServiceHost host1 = new ServiceHost(typeof(MyService1), anEndpointAddress);
2. Я бы предпочел такой подход. Реализация службы не будет иметь переменной экземпляра, содержащей MyObject. Напишите пользовательский класс ServiceHost, например
public class MyServiceHost : ServiceHost
{
public MyType MyObject { get; private set; }
public MyServiceHost(Type serviceType, Uri[] baseAddresses, MyType myObject)
:base(serviceType, baseAddresses)
{
this.MyObject = myObject;
}
}
Теперь разместите службу на нескольких адресах конечных точек, используя
MyType o1 = new MyType();
ServiceHost host1 = new MyServiceHost(typeof(MyService, anEndpointAddress, o1);
В методах обслуживания используйте OperationContext.Current.Host
, чтобы получить servicehost, а из hostm вы можете получить свой объект.