0

我有一个 WCF 服务,它有一个名为GetEmail. GetEmail从数据库表中提取电子邮件。要求是向个人用户(此服务的消费者)发送独特的电子邮件内容。这意味着没有两个用户可以处理单个电子邮件内容。但是由于 WCF 服务设计,这被违反了。具体来说,WCFConcurrencyInstanceContent模式。抱歉,我现阶段无法更改服务设计。

问题:是否可以在不更改服务设计或数据库表(锁定)的情况下建立对电子邮件内容的同步访问。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
        }
    }
4

2 回答 2

0

这是一个简单的方法:

[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
        }
    }
}

锁将序列化对电子邮件的访问,因此一次只能处理一个呼叫。它假定当您检索电子邮件时,您将对下一封电子邮件的引用全部移至锁内。它还假定这是检索这些电子邮件的唯一方法。任何其他可以检索它们的方法都需要共享同一个锁对象。

于 2013-10-17T14:20:05.537 回答
0

我认为将同步访问的责任放在数据库上将是最好的方法。大多数数据库都有事务的概念,可以让您实现目标。

引用维基百科

[事务] 在同时访问数据库的程序之间提供隔离。

于 2013-10-17T14:21:05.083 回答