मेरे .NET कोर एप्लिकेशन में, मेरे पास एक सजावटी वर्ग है जो मुझे आशा है कि लेनदेनस्कोप में डेटाबेस कमांड के निष्पादन को लपेटकर लेनदेन को संभालने में सक्षम होगा। दुर्भाग्यवश, ऐसा लगता है कि ट्रांज़ेक्शनस्कोप के लिए समर्थन इसे .NET कोर 2: https://github.com/dotnet/corefx/issues/19708:ट्रांज़ेक्शनस्कोप के बिना नेट कोर ट्रांजैक्शन सजावटी
ट्रांज़ेक्शनस्कोप की अनुपस्थिति में, मुझे इस समस्या का सबसे अच्छा तरीका नहीं है । TransactionScope के साथ, मेरे लेनदेन डेकोरेटर इस तरह दिखता है:
public class TransactionCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand>
{
private readonly ICommandHandler<TCommand> decorated;
//constructor
public void Handle(TCommand command)
{
using (var scope = new TransactionScope())
{
this.decorated.Handle(command);
scope.Complete();
}
}
}
वर्तमान में, ICommandHandler में से प्रत्येक के कार्यान्वयन एक उदाहरण मेरे DapperContext वर्ग के इस तरह हो जाता है और आदेशों संभालता है:
public void Handle(UpdateEntity command)
{
var sql = Resources.UpdateEntityPart1;
this.context.Execute(sql, new
{
id = command.Id;
});
var sql = Resources.UpdateEntityPart2;
//call Execute again
}
DapperContext वर्ग एक कनेक्शन कारखाना है प्रत्येक निष्पादन विधि के लिए प्रत्येक कॉल के लिए नए कनेक्शन प्रदान करने के लिए। चूंकि कमांड हैंडलर को एक एकल टीकॉमैंड के लिए एकाधिक डेटाबेस लिखना पड़ सकता है, इसलिए कुछ विफल होने पर मुझे रोलबैक करने की क्षमता की आवश्यकता होती है। लेनदेन बनाने के साथ-साथ जब मैं कनेक्शन बनाता हूं (डैपरकॉन्टेक्स्ट में) का मतलब है कि मेरे पास कनेक्शन में लेनदेन संबंधी व्यवहार की गारंटी देने का कोई तरीका नहीं है।
एक विकल्प मैं माना जाता है नहीं लगता है कि सभी संतोषजनक:
- आदेश हैंडलर स्तर पर कनेक्शन और लेनदेन प्रबंधित करें, तो व्यवसायिक संदर्भ के लिए है कि जानकारी गुजरती हैं। इस तरह दिए गए आदेश के लिए सभी प्रश्न एक ही कनेक्शन और लेनदेन का उपयोग करते हैं। यह काम कर सकता है, लेकिन मुझे इस जिम्मेदारी के साथ अपने कमांड हैंडलरों को बोझ करने का विचार पसंद नहीं है। समग्र डिजाइन के संदर्भ में, यह अधिक स्वाभाविक लगता है कि डैपरकॉन्टेक्स्ट कनेक्शन होने के बारे में चिंता करने का स्थान है।
मेरा प्रश्न, फिर: क्या ट्रांज़ेक्शनस्कोप के उपयोग के बिना लेनदेन सजावट लिखने का कोई तरीका है, एनईटी कोर में एसक्लोनकनेक्शन की वर्तमान सीमाओं को देखते हुए? यदि नहीं, तो अगला सबसे अच्छा समाधान क्या है जो एकल जिम्मेदारी के सिद्धांत का भी उल्लंघन नहीं करता है?
यदि मैं आप थे, तो मैं माइक्रोसॉफ्ट को समझाने के लिए उस विशेष गिरहूब मुद्दे पर टिप्पणी करूंगा कि यह एक बड़ी असंगतता है और बिल्कुल ठीक किया जाना चाहिए। मुझे लगता है कि ट्रांजैक्शनस्कोप कोर 2 में काम नहीं करता है तो कई संगठनों के लिए यह एक बड़ी समस्या है। – Steven