[英]Dealing with concurrency and complex WCF services interacting with objects of the overall application
我很喜欢创建和托管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)如何处理服务和应用程序之间在此共享资源上的冲突? 当我的应用程序运行并托管服务时,我的应用程序可以将列表中的项目插入并删除它们,同样可以执行该服务。 我需要互斥锁吗? 如何处理呢? 请注意,并发问题涉及两个参与者:主应用程序和服务。 的确,服务是单例的,但是应用程序在列表上起作用!!! 我假设该服务是由外部实体调用的,当这种情况发生时,应用程序仍然可以正常运行吗? 在这种情况下是否存在并发???
谢谢
将构造函数添加到MyService中以传递列表肯定可以按您期望的那样工作。 就像我在给然而问题评论说,ServiceHost的只会包含了为MyService类的一个实例,因此列表不会被共享,因为只有一个服务实例会消耗它。
我将看WCF的依赖项注入器(DI)容器 ,以执行您尝试做的事情。 让DI容器为您的服务提供单例列表实例。 另外@ Smudge202绝对正确,因为使用并发收集功能是实现列表所需要的。
基于注释线程的UPDATE:
通过从DI容器中获取对象的所有依赖关系,而不是在代码中手动创建它们,DI方法将起作用。 您注册容器将在应用程序启动过程中提供的所有类型。 当应用程序(或WCF)需要新的对象实例时,它将从容器中请求它,而不是“更新”它。 例如, Castle Windsor WCF集成库实现了从容器向WCF提供服务实例所需的所有接线。 这篇文章解释了如果要滚动自己的WCF集成,如何将Microsoft Unity DI容器与WCF 一起使用的详细信息 。
此问题中引用的共享列表将在容器中注册为应用程序中已实例化的对象。 从DI容器中启动WCF服务实例时,将提供所有构造函数参数,包括对共享列表的引用。 关于依赖项注入和控制反转的信息很多,但是这篇Martin Fowler的文章是一个不错的起点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.