我有从不同进程调用的方法,有时是同时进行的。在那个方法的某个地方,我想要计算折扣。为此,我创建了一个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 processing
DiscountService:
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是否应该是线程安全的?如果是这样,我将如何处理这种情况。或者我是否需要某种类型的管理器,为每个主要的方法调用“new”DiscountService?或者这个足够吗?
感谢
编辑: 做这样的事情有没有模式。有一项服务可以同时运作吗?
是否有一本书,复杂的视频,谈论这样的东西的设计/模式?举例?
答案 0 :(得分:3)
一般情况下,如果你从数据库中读取一些给定ID的东西,从你检索的数据中你可以计算出你需要的一切,那么你就不需要线程安全,因为你没有共享内存访问。
从您的帖子中不清楚的是,是否从多个线程访问了提供的discountDocument,或者它是否仅在请求处理过程中存在。
从我所看到的,我认为discountDocument需要是线程安全的(在对象内部,但这只是一个猜测,因为我不知道还有什么事情发生),但是服务很好。
答案 1 :(得分:1)
从您的代码中,您正在使用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必须是线程安全的,或者至少是getavailablediscount。您要么创建或重用现有连接的机会非常高,如果没有保护机制就会遇到问题。
DiscountDocument通过请求进来,我假设每个请求都有一个不同的文档,因此在DiscountDocument中不太可能出现问题。
但是,如果discountDocument确实也是一个共享资源,那么它可能需要一些自己的锁定,然后问题变得越来越大,因为你冒着在这种情况下遇到死锁的风险。