Տվյալների մշակման հարցման (DPR) նկարագրման ձեռնարկ
Բովանդակություն
- Ներածություն
- C# ֆայլի նկարագրություն
- Օժանդակ դասերի սահմանում
- Հիմնական դասի սահմանում
- Կոնստրուկտորի ձևավորում
- Execute
Ներածություն
Սերվիսային երկար տևող հարցումներ կատարելու և կատարման ընթացքին հետևելու համար նկարագրվում է Տվյալների մշակման հարցում (DPR - Data Processing Request): Տե՛ս Ասինխրոն մշակում կիրառությունների սերվերի վրա։
Տվյալների մշակման հարցման նկարագրության համար հարկավոր է իրականացնել սերվերում աշխատող տրամաբանությունը C# դասում (.cs
ֆայլում)։
Հարկավոր է սահմնել մուտքային և ելքային պարամետրերի դասեր (կարող ենք օգտագործվել գոյություն ունեցողները)։
Կազմակերպության սեփական Տվյալների մշակման հարցումների ստեղծման համար տե՛ս այստեղ:
C# ֆայլի նկարագրություն
Ձեռնարկի ամբողջական կոդը ինչպես նաև սկրիպտից կանչի ձևը տե՛ս այստեղ:
Օժանդակ դասերի սահմանում
- Ստեղծել հարցման կատարման համար անհրաժեշտ պարամետրերը նկարագրող դաս։
public class DeleteDocsByIsnRequest { public List<int> DocumentIsns { get; set; } }
- Ստեղծել հարցման կատարման արդյունքում ստացվող տվյալները նկարագրող դասը։
public class DeleteDocsByIsnResponse { public StorageInfo StorageInfo { get; set; } }
Հիմնական դասի սահմանում
- Հայտատարել դաս, որը ունի
DPR
ատրիբուտը և ժառանգում էDataProcessingRequest<R, P>
դասը՝ որպեսR
փոխանցելով հարցման կատարման արդյունքում ստացվող տվյալները նկարագրող դասը, իսկ որպեսP
՝ պարամետրերը նկարագրող դասը։ Պարամետրերի բացակայության դեպքում անհրաժեշտ է փոխանցելNoParam
դասը, իսկ արդյունքի բացակայության դեպքում՝NoResult
դասը։[DPR(DPRType = DPRType.Other, ArmenianCaption = "Փաստաթղթերի հեռացում", EnglishCaption = "Deletion of documents")] public class DeleteDocsByIsnDPR : DataProcessingRequest<DeleteDocsByIsnResponse, DeleteDocsByIsnRequest>
DPR
ատրիբուտում հարկավոր է նշել տեսակը, հայերեն անվանումը յունիկոդ կոդավորմամբ և անգլերեն անվանումը։
Կոնստրուկտորի ձևավորում
- Ձևավորել կոնստրուկտորը, որտեղ անհրաժեշտ է ինյեկցիա անել աշխատանքի համար անհրաժեշտ սերվիսները։
private readonly IDocumentService documentService; private readonly IStorageService storageService; public DeleteDocsByIsnDPR(IDocumentService documentService, IStorageService storageService) { this.documentService = documentService; this.storageService = storageService; }
Execute
Հիմնական տրամաբանությունը հարկավոր է իրականացնել Execute մեթոդում, այն ստանում է մուտքային պարամետրերը նկարագրող դասը և պետք է վերադարձնի կատարման արդյունքում ստացվող տվյալները նկարագրող դասը։
Ստորև օրինակում նկարագրված Տվյալների մշակման հարցումը հեռացնում է կատարման պարամետրում տրված ISN-ներով փաստաթղթերը համակարգից IDocumentService.Delete մեթոդի միջոցով, ստեղծում է TextReport, որում լրացնում է կատարման ընթացքում առաջացած սխալները և վերադարձնում է կլիենտին։
public override async Task<DeleteDocsByIsnResponse> Execute(DeleteDocsByIsnRequest request, CancellationToken stoppingToken)
{
// սխալների հավաքագրման համար տեքստային հաշվետվության ստեղծում
using var report = new TextReport.TextReport(this.storageService)
{
ArmenianCaption = "Կատարման ընթացքում առաջացած սխալներ".ToArmenianANSI(),
EnglishCaption = "Errors which occured during execution"
};
// 80 լայնությամբ ֆրագմենտի ավելացում հաշվետվությունում
const int fragmentLength = 80;
report.AddFragment(fragmentLength);
// հաշվետվությունում գլխագիր տողի ավելացում թավ տառաոճով
var formattedText = TextReport.TextReport.ApplyStyle("Փաստաթղթերի հեռացման սխալներ".ToArmenianANSI(), TextReportStyle.Bold);
report.AddHeader(formattedText);
// DPR-ի կատարման պրոգրեսի պատուհանում "Հարցման կատարում" անունով փուլի ավելացում
this.Progress.Add("Հարցման կատարում".ToArmenianANSI());
var isns = request.DocumentIsns;
this.Progress.CurrentPhase.Total = isns.Count; // պրոգրեսի ընթացիկ փուլում մշակվող տվյալների քանակը տալով
// պրոգրեսի պատուհանում հնարավոր է ցույց տալ մշակման ենթակա տվյալներից քանիսն են մշակվել
this.Progress.CurrentPhase.Row = 0; // ընթացիկ պահին մշակվել է 0 փաստաթուղթ
foreach (int isn in isns)
{
if (stoppingToken.IsCancellationRequested)
{
break; // եթե DPR-ի կատարման պրոգրեսի պատուհանից սեղմվել է «Ընդհատել» կոճակը, ապա ընդհատվում է կատարումը
}
this.Progress.CurrentPhase.Row++; // ամեն փաստաթղթի մշակման հետ պատուհանում փոխվում է մշակված փաստաթղթերի քանակը, օրինակ 7/11
try
{
//հերթական փաստաթղթի ամբողջական հեռացում
await this.documentService.Delete(isn, false, "Փաստաթղթի հեռացում".ToArmenianANSI());
}
catch (Exception ex)
{
report.AddRow($"Առաջացել է սխալ {0} փաստաթղթի ջնջման ժամանակ։".ToArmenianANSI(), isn);
// առաջացած սխալի հաղորդագրությունների ավելացում որպես տող տեքստային հաշվետվությունում
foreach (string line in ex.Message.Split('\n'))
{
report.AddRow(line, isn);
}
report.AddRow(string.Empty);
}
}
// բոլոր փաստաթղթերի մշակումից հետո հաշվետվությունը պահվում է որպես ֆայլ SaveToStorageAndClose մեթոդի միջոցով,
// որը վերադարձնում է StorageInfo, որը պարունակում է տվյալներ սերվերից ֆայլը բեռնելու համար
return new DeleteDocsByIsnResponse { StorageInfo = await report.SaveToStorageAndClose() };
}