public class LoyaltyAccrualService :ILoyaltyAccrualService
{
private readonly ILoyaltyDataService _loyaltyDataService;
public LoyaltyAccrualService (ILoyaltyDataService loyaltyDataService)
{
_loyaltyDataService = loyaltyDataService;//数据服务必须在该对象初始化
时传入该对象
}
/// <summary>
/// 该方法包含了积分系统累积客户积分的逻辑和规则
/// </summary>
/// <param name="agreement">租赁协议实体</param>
public void Accrue (RentalAgreement agreement)
{
var rentalTimeSpan = agreement.EndDate.Subtract
(agreement.StartDate);
var numberOfDays = (int)rentalTimeSpan.TotalDays;
var pointsPerDay = 1;
if (agreement.Vehicle.Size >=Size.Luxury)
{
pointsPerDay = 2;
}
var points = numberOfDays*pointsPerDay;
//调用数据服务存储客户获得的积分
_loyaltyDataService.AddPoints (agreement.Customer.Id,points);
}
}
ILoyaltyDataService只有两个方法:
public interface ILoyaltyDataService
{
void AddPoints(Guid customerId,int points);
void SubstractPoints(Guid customerId, int points);
}
ILoyaltyDataService作为数据库接口,会通过DI的方式传入到业务层的构造函数。因为我们现在只集中在业务逻辑层,所以我
们在数据服务层只是简单地打印一些东西就好了,FakeLoyaltyDataService实现了ILoyaltyDataService如下:
public class FakeLoyalDataService:ILoyaltyDataService
{
public void AddPoints(Guid customerId, int points)
{
Console.WriteLine("客户{0}增加了{1}积分",customerId,points);
}
public void SubstractPoints(Guid customerId, int points)
{
Console.WriteLine("客户{0}减少了{1}积分", customerId, points);
}
}
到这里,已经完成了累积积分的业务逻辑!现在回到客户关心的问题上,如何兑换积分?创建一个接口
ILoyaltyRedemptionService: