Передача объектов нескольким службам - PullRequest
2 голосов
/ 16 сентября 2010

Мне нужно запустить несколько служб WCF одновременно из одной службы Windows.Каждая служба WCF в основном одинакова, но имеет один объект, специфичный для этого экземпляра.Итак, со следующим классом обслуживания:

public class MyService : IMyContract
{
    public MyType MyObject { get; set; }

    public MyService(MyType myObject)
    {
        this.MyObject = myObject;
    }
    // more here...
}

Я надеялся, что смогу сделать что-то вроде этого:

MyType o1 = new MyType();
MyService s1 = new MyService(o1);
ServiceHost host1 = new ServiceHost(s1, anEndpointAddress);
MyType o2 = new MyType();
MyService s2 = new MyService(s2);
ServiceHost host2 = new ServiceHost(s2, anEndpointAddress);

Проблема в том, что если вы используете конструктор ServiceHost, который принимаетобъект в качестве первого аргумента, этот объект должен быть singletonInstance, но мне нужно несколько экземпляров.

С другой стороны, если я использую конструктор, который принимает тип в качестве первого аргумента (ServiceHost host = new ServiceHost(typeof(MyService), endpointAddress);)Я не знаю, как установить для MyObject подходящее значение.

Есть ли способ решить эту проблему?

Спасибо, привет, Миэль.

Ответы [ 2 ]

3 голосов
/ 16 сентября 2010

Я могу думать о двух путях - способ 2 будет предпочтительным подходом.

  1. Создайте несколько классов, которые просто наследуются от вашего класса обслуживания. Например,

    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 вы можете получить свой объект.

0 голосов
/ 16 сентября 2010

Вам нужно подключить свой собственный ServiceHost.

Сначала создайте свой собственный ServiceHost, унаследовав его, и примените там свою пользовательскую загрузку.Затем создайте поведение, реализовав IServiceBehavior и изменив ChannelDispatchers, чтобы установить свой собственный ServiceHost.

Для получения дополнительной информации просмотрите здесь:

http://msdn.microsoft.com/en-us/library/aa395224.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...