我有从不同进程调用的方法,有时是并发的。在那个方法的某个地方,我应该计算折扣。为此,我创建了一个DiscountService,它从DB读取信息并计算给定客户号的折扣。如前所述,主方法可以同时从具有不同客户号的不同位置调用。
主要方法:
// this may be called simultaneously
public void Handle(IDocument document)
{
// document contains customer number
...
// update document discount property
this._discountService.Process(document);
// continue processingDiscountService:
public class DiscountService : IDiscountService
{
private readonly IDiscountDataAccess discountDataAccess;
private readonly ILog logger;
public DiscountService(ILog logger, IDiscountDataAccess discountDataAccess)
{
this.discountDataAccess = discountDataAccess;
this.logger = logger;
}
public void Process(IDiscountDocument discountDocument)
{
this.ProcessDiscount(discountDocument);
discountDocument.Update();
}
private void ProcessDiscount(IDiscountDocument discountDocument)
{
Discount discount = this.GetAvailableDiscount(discountDocument);
...
}
private Discount GetAvailableDiscount(IDiscountDocument discountDocument)
{
// Stored proc
return this.discountDataAccess.GetAvailableDiscount(
discountDocument.CustomerNumber,
discountDocument.StartDate,
discountDocument.EndDate);
}
...
}我的问题是我的DiscountService是否应该是线程安全的?如果是这样的话,我将如何处理这种情况。或者,我是否需要某种类型的管理器,为每个主方法调用“新”DiscountService?还是这样就够了?
谢谢
编辑:有没有这样做的模式。有一种服务可以(同时)运作?
是否有一本书,pluralsight视频,谈论这样的东西的设计/模式?给出例子?
发布于 2015-03-17 14:25:15
通常,如果您从DB中读取一些给定ID的内容,从您检索的数据中可以计算出所需的所有内容,那么就不需要线程安全了,因为您没有共享内存访问权限。
您的文章中不清楚的是提供的discountDocument是否是从多个线程访问的,或者它是否只存在于请求处理的时间之外。
从我可以看到的情况来看,我假设discountDocument需要线程安全(在对象中,但这只是猜测,因为我不知道它还会发生什么),但是服务还是一样的好。
发布于 2015-03-17 14:33:39
从您的代码中,您正在使用discountDataAccess进行依赖注入:
public DiscountService(ILog logger, IDiscountDataAccess discountDataAccess)
{
this.discountDataAccess = discountDataAccess;
this.logger = logger;
}然后,您将使用这个注入的服务,如下所示:
private Discount GetAvailableDiscount(IDiscountDocument discountDocument)
{
// Stored proc
return this.discountDataAccess.GetAvailableDiscount(
discountDocument.CustomerNumber,
discountDocument.StartDate,
discountDocument.EndDate);
}因此,对我来说,结论是discountDataAccess必须是线程安全的,或者至少是可获得的折扣。创建或重用现有连接的可能性很大,如果没有保护机制,则会遇到问题。
DiscountDocument是通过请求传入的,我假设每个请求都有不同的文档,所以在DiscountDocument中不太可能出现问题。
但是,如果discountDocument确实也是一个共享资源,那么它可能需要自己的一些锁定,然后问题会越来越大,因为在这种情况下可能会出现死锁。
https://stackoverflow.com/questions/29101367
复制相似问题