【发布时间】:2011-05-17 11:33:13
【问题描述】:
我喜欢创建和托管 WCF 服务。 到目前为止,我可以创建服务,定义服务和数据(接口)的合同,并定义主机和配置选项以达到它们(端点规范)。
好吧,考虑一下这段代码定义一个服务并使用它(这里没有提到 app.config 中定义的端点,这里没有显示):
[ServiceContract]
public interface IMyService {
[OperationContract]
string Operation1(int param1);
[OperationContract]
string Operation2(int param2);
}
public class MyService : IMyService {
public string Operation1(int param1) { ... }
public string Operation2(int param2) { ... }
}
public class Program {
public static void Main(stirng[] args) {
using (ServiceHost host = new ServiceHost(typeof(MyService))) {
host.Open();
...
host.Close();
}
}
}
嗯,这种结构在创建可以称为独立服务的东西时非常有用。 如果我需要我的服务来使用更大应用程序的对象怎么办。 例如,我需要一项服务,该服务基于我的程序中某处定义的某个集合(托管该服务)来执行某些操作。服务必须查看此集合并搜索并返回特定元素。
我说的列表是由程序管理并由它编辑修改的列表。
我有以下问题:
1) 如何构建能够处理此列表的服务?
我知道一个可能的选择是使用重载的ServiceHost 构造函数接受Object 而不是Type 服务。
所以我可以在那里传递我的清单。好吃吗?
[ServiceContract]
public interface IMyService {
[OperationContract]
string Operation1(int param1);
[OperationContract]
string Operation2(int param2);
}
public class MyService : IMyService {
private List<> myinternallist;
public MyService(List<> mylist) {
// Constructing the service passing the list
}
public string Operation1(int param1) { ... }
public string Operation2(int param2) { ... }
}
public class Program {
public static void Main(stirng[] args) {
List<> thelist;
...
MyService S = new MyService(thelist)
using (ServiceHost host = new ServiceHost(S)) {
host.Open();
...
host.Close();
// Here my application creates a functions and other that manages the queue. For this reason my application will edit the list (it can be a thread or callbacks from the user interface)
}
}
}
这个例子应该澄清。 这是做的好方法吗?我做得对吗?
2) 如何处理我的服务和我的应用程序之间的共享资源冲突? 当我的应用程序运行并托管服务时,我的应用程序可以在列表中插入项目并删除它们,服务也可以这样做。我需要互斥体吗?如何处理? 请注意,并发问题涉及两个参与者:主应用程序和服务。服务确实是单例的,但应用程序在列表中起作用!!! 我假设该服务是由外部实体调用的,当这种情况发生时,应用程序仍然可以运行吗?这种情况下有并发吗???
谢谢
【问题讨论】:
-
在第 1 点上,构造函数用于创建单例服务。 ServiceHost 将仅包含该实例。当然,如果你这样做,它肯定会解决 #2 中的任何问题 ;-)
-
拜托大家在编辑中发现变化
-
编辑了我的帖子。 @Sixto 对维护/修改您的单例方法有很好的建议,但实际上我相信您正在尝试实现 Sessions 的等效性。
标签: c# .net wcf concurrency