我需要从单个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。
答案 0 :(得分:3)
我可以想到两种方式 - 方式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获取对象。
答案 1 :(得分:0)
您需要插入自己的ServiceHost
。
首先通过继承它来创建自定义ServiceHost并在那里实现自定义加载。
然后通过实施IServiceBehavior
创建行为并修改ChannelDispatchers
以设置自己的ServiceHost。
请点击此处了解更多信息: