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將管道步驟描述為類型。在下面的一個示例中,我們創建了回合,以舍入我們得到的總保險費:
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 . AddStep < RoundOffStep > ( ) ;獲取管道對象使用方法構建管道構建器。之後,您可以調用管道的方法執行executeasync執行所有添加的步驟:
var pipeline = builder . Build ( ) ;
var result = await pipeline . ExecuteAsync ( new InsurancePremiumModel ( ) ) ;