将对象传递给多个服务

时间:2010-09-16 11:07:49

标签: c# wcf

我需要从单个Windows服务同时运行多个WCF服务。每个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设置为合适的值。

有没有办法解决这个问题?

谢谢,问候,Miel。

2 个答案:

答案 0 :(得分:3)

我可以想到两种方式 - 方式2将是首选方法。

  1. 创建多个只继承自服务类的类。例如,

    public class MyService1 : MyService { 
    ... // put a constructor that accepts your object 
    }
    public class MyService2 : MyService { ...  }
    
    ...
    
  2. 现在主持

    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获取对象。

答案 1 :(得分:0)

您需要插入自己的ServiceHost

首先通过继承它来创建自定义ServiceHost并在那里实现自定义加载。 然后通过实施IServiceBehavior创建行为并修改ChannelDispatchers以设置自己的ServiceHost。

请点击此处了解更多信息:

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