Προγραμματισμός

Τρόπος χρήσης αντικειμένων μεταφοράς δεδομένων στο ASP.NET Core 3.1

Ένα Αντικείμενο Μεταφοράς Δεδομένων (κοινώς γνωστό ως DTO) είναι συνήθως μια παρουσία μιας κλάσης POCO (απλό παλιό αντικείμενο CLR) που χρησιμοποιείται ως κοντέινερ για να ενθυλακώσει δεδομένα και να τα μεταφέρει από ένα επίπεδο της εφαρμογής σε ένα άλλο. Συνήθως θα βρείτε τα DTO που χρησιμοποιούνται στο επίπεδο υπηρεσίας για να επιστρέψετε τα δεδομένα πίσω στο επίπεδο παρουσίασης. Το μεγαλύτερο πλεονέκτημα της χρήσης DTO είναι η αποσύνδεση πελατών από τις εσωτερικές δομές δεδομένων σας.

Αυτό το άρθρο περιγράφει γιατί πρέπει να χρησιμοποιήσουμε αντικείμενα μεταφοράς δεδομένων και πώς μπορούμε να συνεργαστούμε μαζί τους στο ASP.NET Core 3.1. Για να εργαστείτε με τα παραδείγματα κώδικα που παρέχονται σε αυτό το άρθρο, θα πρέπει να έχετε εγκαταστήσει το Visual Studio 2019 στο σύστημά σας. Εάν δεν έχετε ήδη αντίγραφο, μπορείτε να κατεβάσετε το Visual Studio 2019 εδώ.

Δημιουργήστε ένα έργο ASP.NET Core 3.1 API

Πρώτα απ 'όλα, ας δημιουργήσουμε ένα έργο ASP.NET Core στο Visual Studio. Υποθέτοντας ότι το Visual Studio 2019 είναι εγκατεστημένο στο σύστημά σας, ακολουθήστε τα βήματα που περιγράφονται παρακάτω για να δημιουργήσετε ένα νέο έργο ASP.NET Core API στο Visual Studio.

  1. Εκκινήστε το Visual Studio IDE.
  2. Κάντε κλικ στο "Δημιουργία νέου έργου".
  3. Στο παράθυρο "Δημιουργία νέου έργου", επιλέξτε "ASP.NET Core Web Application" από τη λίστα των προτύπων που εμφανίζονται.
  4. Κάντε κλικ στο Επόμενο.
  5. Στο παράθυρο "Διαμόρφωση του νέου έργου", καθορίστε το όνομα και την τοποθεσία για το νέο έργο.
  6. Κάντε κλικ στο Δημιουργία.
  7. Στο παράθυρο "Δημιουργία νέας εφαρμογής ASP.NET Core Web" που εμφανίζεται στη συνέχεια, επιλέξτε .NET Core ως χρόνο εκτέλεσης και ASP.NET Core 3.1 (ή μεταγενέστερη έκδοση) από την αναπτυσσόμενη λίστα στην κορυφή.
  8. Επιλέξτε "API" ως πρότυπο έργου για να δημιουργήσετε μια νέα εφαρμογή ASP.NET Core API.
  9. Βεβαιωθείτε ότι τα πλαίσια ελέγχου "Ενεργοποίηση υποστήριξης Docker" και "Διαμόρφωση για HTTPS" δεν είναι επιλεγμένα, καθώς δεν θα χρησιμοποιούμε αυτές τις δυνατότητες εδώ.
  10. Βεβαιωθείτε ότι ο Έλεγχος ταυτότητας έχει οριστεί ως "Χωρίς έλεγχο ταυτότητας", καθώς ούτε θα χρησιμοποιούμε έλεγχο ταυτότητας.
  11. Κάντε κλικ στο Δημιουργία.

Αυτό θα δημιουργήσει ένα νέο έργο ASP.NET Core API στο Visual Studio. Θα χρησιμοποιήσουμε αυτό το έργο για να συνεργαστούμε με αντικείμενα μεταφοράς δεδομένων στις επόμενες ενότητες αυτού του άρθρου.

Γιατί να χρησιμοποιήσετε αντικείμενα μεταφοράς δεδομένων (DTO);

Κατά το σχεδιασμό και την ανάπτυξη μιας εφαρμογής, εάν χρησιμοποιείτε μοντέλα για τη μετάδοση δεδομένων μεταξύ των επιπέδων και την αποστολή δεδομένων πίσω στο επίπεδο παρουσίασης, τότε εκθέτετε τις εσωτερικές δομές δεδομένων της εφαρμογής σας. Αυτό είναι ένα μεγάλο ελάττωμα σχεδιασμού στην εφαρμογή σας.

Με την αποσύνδεση των επιπέδων σας, τα DTO διευκολύνουν τη ζωή όταν εφαρμόζετε API, εφαρμογές MVC και επίσης μοτίβα ανταλλαγής μηνυμάτων όπως το Broker μηνυμάτων Το DTO είναι μια εξαιρετική επιλογή όταν θέλετε να περάσετε ένα ελαφρύ αντικείμενο πέρα ​​από το καλώδιο - ειδικά όταν περνάτε το αντικείμενο σας μέσω ενός μέσου που περιορίζεται από το εύρος ζώνης.

Χρησιμοποιήστε DTO για αφαίρεση

Μπορείτε να εκμεταλλευτείτε τα DTO για να αφαιρέσετε τα αντικείμενα τομέα της εφαρμογής σας από το περιβάλλον εργασίας χρήστη ή το επίπεδο παρουσίασης. Με αυτόν τον τρόπο, το επίπεδο παρουσίασης της εφαρμογής σας αποσυνδέεται από το επίπεδο υπηρεσίας. Επομένως, εάν θέλετε να αλλάξετε το επίπεδο παρουσίασης, μπορείτε να το κάνετε εύκολα, ενώ η εφαρμογή θα συνεχίσει να λειτουργεί με το υπάρχον επίπεδο τομέα. Ομοίως, μπορείτε να αλλάξετε το επίπεδο τομέα της εφαρμογής σας χωρίς να χρειάζεται να αλλάξετε το επίπεδο παρουσίασης της εφαρμογής.

Χρησιμοποιήστε DTO για απόκρυψη δεδομένων

Ένας άλλος λόγος για τον οποίο θέλετε να χρησιμοποιήσετε DTO είναι η απόκρυψη δεδομένων. Δηλαδή, χρησιμοποιώντας τα DTO μπορείτε να επιστρέψετε μόνο τα ζητούμενα δεδομένα. Για παράδειγμα, ας υποθέσουμε ότι έχετε μια μέθοδο που ονομάζεται GetAllEm Employees () που επιστρέφει όλα τα δεδομένα που αφορούν όλους τους υπαλλήλους. Ας το επεξηγήσουμε γράφοντας κάποιον κώδικα.

Στο έργο που δημιουργήσαμε νωρίτερα, δημιουργήστε ένα νέο αρχείο που ονομάζεται Employee.cs. Γράψτε τον ακόλουθο κώδικα μέσα σε αυτό το αρχείο για να ορίσετε μια κλάση μοντέλου με το όνομα Employee.

δημόσιος υπάλληλος

    {

δημόσιο int Id {get; σειρά; }

δημόσια συμβολοσειρά FirstName {get; σειρά; }

δημόσια συμβολοσειρά LastName {get; σειρά; }

δημόσια συμβολοσειρά DepartmentName {get; σειρά; }

δημόσιο δεκαδικό Basic {get; σειρά; }

δημόσιο δεκαδικό DA {get; σειρά; }

δημόσιο δεκαδικό HRA {get; σειρά; }

δημόσιο δεκαδικό NetSalary {get; σειρά; }

    }

Σημειώστε ότι η κλάση υπαλλήλων περιέχει ιδιότητες όπως Id, FirstName, LastName, Department, Basic, DA, HRA και NetSalary. Ωστόσο, το επίπεδο παρουσίασης ενδέχεται να χρειάζεται μόνο το αναγνωριστικό, το όνομα, το επώνυμο και το όνομα τμήματος των υπαλλήλων από τη μέθοδο GetAllEm Employees (). Εάν αυτή η μέθοδος επιστρέψει μια λίστα, τότε ο καθένας θα μπορεί να δει τα στοιχεία του μισθού ενός υπαλλήλου. Δεν το θέλεις.

Για να αποφύγετε αυτό το πρόβλημα, μπορείτε να σχεδιάσετε μια τάξη DTO με το όνομα EmployeeDTO που θα περιέχει μόνο τις ιδιότητες που ζητούνται (όπως Id, FirstName, LastName και Department Name).

Δημιουργήστε μια τάξη DTO στο C #

Για να το επιτύχετε αυτό, δημιουργήστε ένα αρχείο με το όνομα EmployeeDTO.cs και γράψτε τον παρακάτω κώδικα.

δημόσια τάξη EmployeeDTO

    {

δημόσιο int Id {get; σειρά; }

δημόσια συμβολοσειρά FirstName {get; σειρά; }

δημόσια συμβολοσειρά LastName {get; σειρά; }

δημόσια συμβολοσειρά DepartmentName {get; σειρά; }

    }

Τώρα που είναι διαθέσιμες οι κλάσεις αντικειμένων μοντέλου και μεταφοράς δεδομένων, ίσως θελήσετε να δημιουργήσετε μια κλάση μετατροπέα που περιέχει δύο μεθόδους: μία για να μετατρέψετε μια παρουσία της κλάσης μοντέλου υπαλλήλου σε μια παρουσία του EmployeeDTO και (αντίστροφα) μία για να μετατρέψετε μια παρουσία του EmployeeDTO σε μια παρουσία της κατηγορίας μοντέλου Employee. Μπορείτε επίσης να επωφεληθείτε από το AutoMapper, μια δημοφιλή βιβλιοθήκη αντιστοίχισης αντικειμένου για να χαρτογραφήσετε αυτούς τους δύο διαφορετικούς τύπους. Μπορείτε να διαβάσετε περισσότερα για το AutoMapper εδώ.

Πρέπει να δημιουργήσετε μια λίστα στο επίπεδο υπηρεσίας της εφαρμογής σας και να επιστρέψετε τη συλλογή στο επίπεδο παρουσίασης.

Αμετάβλητο των DTO

Ένα DTO προορίζεται για τη μεταφορά δεδομένων από ένα επίπεδο μιας εφαρμογής σε ένα άλλο επίπεδο. Ο καταναλωτής ενός DTO ενδέχεται να είναι ενσωματωμένος στο .NET / C # / Java ή ακόμα και σε JavaScript / TypeScript. Ένα DTO συχνά σειριοποιείται έτσι ώστε να μπορεί να είναι ανεξάρτητο από την τεχνολογία που χρησιμοποιείται στον δέκτη. Στις περισσότερες περιπτώσεις, ο παραλήπτης των δεδομένων δεν χρειάζεται να τροποποιήσει αυτά τα δεδομένα μετά την παραλαβή - ιδανικά δεν θα έπρεπε!

Αυτό είναι ένα κλασικό παράδειγμα της σημασίας του αμετάβλητου. Και είναι ακριβώς ο λόγος για τον οποίο ένα DTO πρέπει να είναι αμετάβλητο!

Υπάρχουν διάφοροι τρόποι με τους οποίους μπορείτε να εφαρμόσετε αμετάβλητα DTO στο C #. Θα μπορούσατε να χρησιμοποιήσετε ένα ReadOnlyCollection ή τους αμετάβλητους τύπους συλλογής που είναι ασφαλείς στο νήμα που υπάρχουν στο System.Collections. Αμετάβλητος χώρος ονομάτων. Μπορείτε να εκμεταλλευτείτε τους τύπους εγγραφών στο C # 9 για να εφαρμόσετε επίσης αμετάβλητα DTO.

Ο σχεδιασμός βάσει τομέα αναμένει ότι τα αντικείμενα τομέα είναι εξωτερικά αμετάβλητα. Αυτός είναι ένας καλός λόγος για να κάνετε τα DTO σας αμετάβλητα, έτσι δεν είναι;

Προκλήσεις σειριοποίησης DTO

Θα πρέπει να είστε σε θέση να σειριοποιήσετε / αποστειρώσετε ένα DTO απρόσκοπτα έτσι ώστε να μπορεί να περάσει κάτω από το καλώδιο. Στην πράξη, ωστόσο, ίσως χρειαστεί να επιλύσετε ορισμένα προβλήματα σειριοποίησης όταν εργάζεστε με DTO. Μπορεί να έχετε πολλές οντότητες ή τάξεις μοντέλων σε μια πραγματική εφαρμογή και καθένας από αυτούς μπορεί να έχει αναφορές μεταξύ τους.

Ας υποθέσουμε ότι έχετε δημιουργήσει ένα σύστημα διαχείρισης παρακολούθησης για τους υπαλλήλους του οργανισμού σας. Συνήθως, ενδέχεται να έχετε μια κλάση που ονομάζεται Υπάλληλος στην εφαρμογή σας, η οποία αναφέρεται στην κλάση χρήστη (δηλ. Ένας υπάλληλος είναι χρήστης της εφαρμογής) η οποία με τη σειρά της αναφέρεται στην τάξη Ρόλος. Η τάξη ρόλων ενδέχεται να αναφέρεται στην κλάση δικαιωμάτων που με τη σειρά της ενδέχεται να αναφέρεται στις κλάσεις PermissionType και PermissionGroup. Τώρα, όταν πραγματοποιείτε σειριοποίηση μιας παρουσίας της κλάσης υπαλλήλων, θα καταλήξετε επίσης σε σειριοποίηση αυτών των αντικειμένων. Είναι εύκολο να καταλάβετε ότι, σε ορισμένες περίπλοκες περιπτώσεις, ενδέχεται να καταλήξετε σε σειριοποίηση διαφόρων τύπων.

Αυτό είναι όπου η τεμπέλης φόρτωση ή η ασύγχρονη φόρτωση έρχεται στη διάσωση. Αυτή είναι μια δυνατότητα που μπορεί να σας βοηθήσει να φορτώσετε οντότητες μόνο όταν σας ζητηθεί. Για περισσότερες πληροφορίες σχετικά με τον τρόπο εκτέλεσης τεμπέλης φόρτωσης, μπορείτε να ρίξετε μια ματιά στο άρθρο μου σχετικά με την τεμπέλη αρχικοποίηση στο C #.

Τα Αντικείμενα Μεταφοράς Δεδομένων συνήθως δεν περιέχουν επιχειρηματική λογική - περιέχουν μόνο δεδομένα. Το αμετάβλητο είναι ένα επιθυμητό χαρακτηριστικό όταν εργάζεστε με DTO. Υπάρχουν διάφοροι τρόποι με τους οποίους μπορείτε να εφαρμόσετε αμετάβλητα DTO. Θα συζητήσω περισσότερα για το αμετάβλητο στο C # σε μια μεταγενέστερη ανάρτηση εδώ.

Πώς να κάνετε περισσότερα στο ASP.NET Core:

  • Πώς να χειριστείτε 404 σφάλματα στο ASP.NET Core MVC
  • Πώς να χρησιμοποιήσετε την ένεση εξάρτησης σε φίλτρα δράσης στο ASP.NET Core 3.1
  • Πώς να χρησιμοποιήσετε το μοτίβο επιλογών στο ASP.NET Core
  • Τρόπος χρήσης δρομολόγησης τελικού σημείου στο ASP.NET Core 3.0 MVC
  • Τρόπος εξαγωγής δεδομένων στο Excel στο ASP.NET Core 3.0
  • Πώς να χρησιμοποιήσετε το LoggerMessage στο ASP.NET Core 3.0
  • Πώς να στείλετε email στο ASP.NET Core
  • Τρόπος καταγραφής δεδομένων σε SQL Server στον πυρήνα ASP.NET
  • Πώς να προγραμματίσετε εργασίες χρησιμοποιώντας το Quartz.NET στο ASP.NET Core
  • Πώς να επιστρέψετε δεδομένα από το ASP.NET Core Web API
  • Πώς να μορφοποιήσετε δεδομένα απόκρισης στο ASP.NET Core
  • Πώς να καταναλώσετε ένα ASP.NET Core Web API χρησιμοποιώντας το RestSharp
  • Πώς να εκτελέσετε λειτουργίες ασύγχυσης χρησιμοποιώντας το Dapper
  • Πώς να χρησιμοποιήσετε σημαίες χαρακτηριστικών στο ASP.NET Core
  • Τρόπος χρήσης του χαρακτηριστικού FromServices στο ASP.NET Core
  • Πώς να εργαστείτε με cookie στο ASP.NET Core
  • Πώς να εργαστείτε με στατικά αρχεία στο ASP.NET Core
  • Πώς να χρησιμοποιήσετε το Middle Rewriting URL στο ASP.NET Core
  • Πώς να εφαρμόσετε περιορισμό ρυθμού στο ASP.NET Core
  • Πώς να χρησιμοποιήσετε το Azure Application Insights στο ASP.NET Core
  • Χρήση προηγμένων δυνατοτήτων NLog στο ASP.NET Core
  • Πώς να χειριστείτε σφάλματα στο ASP.NET Web API
  • Πώς να εφαρμόσετε τον παγκόσμιο χειρισμό εξαιρέσεων στο ASP.NET Core MVC
  • Τρόπος χειρισμού μηδενικών τιμών στο ASP.NET Core MVC
  • Προηγμένη έκδοση στο ASP.NET Core Web API
  • Πώς να εργαστείτε με υπηρεσίες εργαζομένων στο ASP.NET Core
  • Τρόπος χρήσης του API προστασίας δεδομένων στο ASP.NET Core
  • Τρόπος χρήσης μεσαίου λογισμικού υπό όρους στο ASP.NET Core
  • Τρόπος εργασίας με την κατάσταση συνεδρίας στον ASP.NET Core
  • Πώς να γράψετε αποτελεσματικούς ελεγκτές στο ASP.NET Core