我有一个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
}
}
答案 0 :(得分: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
}
}
}
锁将序列化对电子邮件的访问,因此一次只能处理一次电话。它假设您在检索电子邮件时,将引用移动到锁内的下一封电子邮件中。它还假设这是检索这些电子邮件的唯一方法。任何其他可以检索它们的方法都需要共享相同的锁对象。
答案 1 :(得分:0)