Dataflow.Pipeline
1.0.0
การแสดงท่อส่งง่ายสำหรับ. NET
แสดงถึงลำดับของขั้นตอนที่ดำเนินการอย่างสม่ำเสมอ
ช่วยให้สามารถแบ่งรหัสจำนวนมากออกเป็นชิ้นเล็ก ๆ เพื่อการอ่านได้ดีขึ้นการขยายและการทดสอบ
ก่อนอื่นคุณควรสร้างประเภทที่จะผ่านระหว่างขั้นตอนไปป์ไลน์:
public class InsurancePremiumModel
{
public decimal TotalPremium { get ; set ; }
}ใช้ PipelineBuilder เพื่อสร้างไปป์ไลน์และเติมด้วยขั้นตอนหนึ่ง เป็นตัวอย่างให้สมมติว่าเราต้องการคำนวณเบี้ยประกันทั่วไปสำหรับชุดลูกค้า:
var customers = GetCustomers ( ) ;
var customersCount = customers . Count ( ) ;
var builder = PipelineBuilder < InsurancePremiumModel >
. StartWith ( ( model , next ) => {
var basePrice = GetBasePrice ( Options . Ambulance , customers ) ;
var ambulancePremium = _ambulanceService . Calculate ( basePrice ) ;
model . TotalPremium += customersCount * ambulancePremium ;
return next . Invoke ( model ) ;
} )
. AddStep ( ( model , next ) => {
var basePrice = GetBasePrice ( Options . Dental , customers ) ;
var dentalPremium = _dentalService . Calculate ( basePrice ) ;
model . TotalPremium += customersCount * dentalPremium ;
return next . Invoke ( model ) ;
} )
. AddStep ( ( model , next ) => {
var basePrice = GetBasePrice ( Options . HomeCare , customers ) ;
var homeCarePremium = _homeCareService . Calculate ( basePrice ) ;
model . TotalPremium += customersCount * homeCarePremium ;
return next . Invoke ( model ) ;
} ) ;เป็นไปได้ที่จะอธิบายขั้นตอนไปป์ไลน์เป็นประเภทโดยใช้อินเตอร์เฟส ipipelinestep ในตัวอย่างด้านล่างเราสร้าง Roundoffstep เพื่อปัดเศษเบี้ยประกันทั้งหมดที่เราได้รับ:
public class RoundOffStep
: IPipelineStep < PriceModel >
{
public Task < PriceModel > InvokeAsync ( PriceModel input , Func < PriceModel , Task < PriceModel > > next )
{
input . TotalPremium = RoundOff ( input . TotalPremium ) ;
return next . Invoke ( input ) ;
}
private decimal RoundOff ( decimal price )
{
var rem = price % 10 ;
if ( rem == 0 ) return price ;
var result = Math . Round ( price / 10 , MidpointRounding . AwayFromZero ) * 10 ;
return rem < 5 ? result + 10.00m : result ;
}
}ดังนั้นคุณสามารถเพิ่มขั้นตอนที่สร้างขึ้นใหม่ให้กับ Builder เช่นนี้:
builder . AddStep < RoundOffStep > ( ) ;เพื่อให้ได้วิธีการใช้วัตถุไปป์ไลน์ของ PipelineBuilder หลังจากนั้นคุณสามารถเรียกวิธีการ ExecuteAnc ของ Pipeline เพื่อดำเนินการตามขั้นตอนทั้งหมด:
var pipeline = builder . Build ( ) ;
var result = await pipeline . ExecuteAsync ( new InsurancePremiumModel ( ) ) ;