同步访问操作协定 WCF
本文关键字:WCF 操作 访问 同步 | 更新日期: 2023-09-27 18:35:43
我有一个WCF服务,它有一个名为GetEmail
的操作协定。 GetEmail
从数据库表中提取电子邮件。要求是向个人用户(此服务的消费者)发送唯一的电子邮件内容。这意味着没有两个用户可以处理单个电子邮件内容。但由于 WCF 服务设计,这被违反了。具体而言,WCF Concurrency
和InstanceContent
模式。抱歉,我在此阶段无法更改服务设计。
问:是否可以在不更改服务设计或数据库表(锁定)的情况下对电子邮件内容构建同步访问。理想情况下,呼叫必须在我的GetEmail
操作合同上排队。我读过IExtensibleObject<T>
但无法将其与我的案件联系起来。
[ErrorBehavior(typeof(ErrorHandler))]
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.PerCall)]
public class EmailRepository : IEmailRepository
{
public string GetEmail(Guid IdUser)
{
//Logic to retrive one email based on data of receive
}
}
这里有一个简单的方法:
[ErrorBehavior(typeof(ErrorHandler))]
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.PerCall)]
public class EmailRepository : IEmailRepository
{
private static object _lockOb = new object();
public string GetEmail(Guid IdUser)
{
lock(_lockOb)
{
//Logic to retrive one email based on data of receive
}
}
}
锁将序列化对电子邮件的访问,因此一次只能处理一个呼叫。它假定当您检索电子邮件时,您将对下一封电子邮件的引用全部移动到锁内。它还假定这是检索这些电子邮件的唯一方法。任何其他可以检索它们的方法都需要共享同一个锁定对象。
我认为将
同步访问的责任放在数据库上将是这里最好的方法。大多数数据库都有事务的概念,应该允许你实现你的目标。
引用维基百科:
[事务] 在并发访问数据库的程序之间提供隔离。