Meilleure pratique d’utilisation des jeux de données typés XSD C # dans les applications d’entreprise

J’essaie de comprendre quelle est la meilleure pratique d’utilisation des tables XSD générées à partir du schéma de firebase database que j’utilise actuellement.

1) Pensez-vous que les informations XSD devraient faire partie du modèle?

2) Cela signifie-t-il que la couche d’access aux données renvoie des ensembles de données et d’autres objects générés?

3) Est-ce que cela passe par toutes les couches du système jusqu’à l’interface utilisateur?

4) Si le fichier XSD fait partie de la couche d’access aux données, dois-je convertir les résultats en objects du modèle? Quelle est la meilleure méthodologie de conversion?

Merci Ronny

Vous avez restreint l’objective et les applications des fichiers XSD en créant des XSD spécifiques aux jeux de données dans votre question.

XSD est l’acronyme de Extensible Scehma Defination. Les normes XSD sont définies par le W3C dans le but de normaliser les fichiers XML que vous pouvez utiliser dans vos applications.

Par exemple, disons que vous utilisez beaucoup dans votre application des fichiers XML que vous pouvez échanger avec différents types de sources distantes. Ces sources peuvent vous envoyer des fichiers XML dans différents formats. Dans votre application, vous devez vous assurer de recevoir le fichier XML au format approprié afin de pouvoir effectuer vos opérations commerciales plus avant sur le fichier XML. Vous devez donc appliquer la normalisation à ces fichiers XML. Vous devrez valider le fichier XML par rapport aux normes acceptables de votre côté. Vous devrez comparer le schéma XML aux normes. Ces normes sont écrites sous forme de XSD. Et vous allez valider le schéma de votre fichier XML par rapport aux normes de schéma définies dans le fichier XSD. C’est le but réel des fichiers XSD.

Maintenant répondre à vos questions ..

1.) Pensez-vous que les informations XSD devraient faire partie du modèle?

Comme je viens de le dire, le fichier XSD stocke le schéma et non les données. De la même manière, dans n’importe quelle application, lorsque vous utilisez des jeux de données qui stockent réellement des données en mémoire au moment de l’exécution, ils ont également leur propre schéma, le formulaire dans lequel elle stockera les données. Celles-ci varient en fonction des données sous-jacentes et de leurs relations. Les gars de MS ont donc introduit le concept de TypedDataSets. TypedDataSets – comme leur nom l’indique, sont des schémas qualifiés du jeu de données que vous allez utiliser au moment de l’exécution pour utiliser les données. Les TypedDataSets sont donc définis sous forme de fichier XSD, qui définit le schéma de DataTables et les relations entre eux. Ainsi, lorsque vous créez un fichier TypedDataSet dans Visual studio, il crée en principe un fichier XSD. Toutes les tables que vous ajoutez de la source de la firebase database à la surface TypedDataSet seront analysées et le schéma de métadonnées de chaque table sera créé dans le fichier XSD. Au moment de l’exécution, lorsque vous sélectionnez des enregistrements dans votre jeu de données, vous savez déjà quel type de données les entre et si les données ne sont pas sous la forme définie dans XSD, vous obtiendrez une exception d’exécution.

Néanmoins, les fichiers XSD ne jouent pas un rôle essentiel au moment de l’exécution, car Visual Studio génère un codebase de jeu de données tpyed à partir du fichier XSD à l’aide de l’ outil XSD.exe .

2) Cela signifie-t-il que la couche d’access aux données renvoie des ensembles de données et d’autres objects générés?

Si votre couche de données utilise TypedDataset, elle renverra DataTables ou DataRow [] ou DataRow selon vos besoins.

3) Est-ce que cela passe par toutes les couches du système jusqu’à l’interface utilisateur?

Vous pouvez créer des objects métier personnalisés, ce qui est une pratique recommandée, au lieu de lancer des objects de jeu de données ici et là dans votre application.

4) Si le fichier XSD fait partie de la couche d’access aux données, dois-je convertir les résultats en objects du modèle? Quelle est la meilleure méthodologie de conversion?

Écrivez un mécanisme de mappage à l’aide de Reflection. Nous mappons nos instances d’object DataRow to Business et nos collections DataTables vers Business.

Vous pouvez commencer à repenser votre projet pour lui donner une architecture plus facile à gérer. Et bien sûr, cela prendra du temps et des efforts, mais vous finirez par avoir d’excellents résultats.

C’est ce que j’ai dans mon projet.

1.) Application.Infrastructure

  • Classes de base pour tous les businessobjects, collection d’objects métier, classes d’access aux données et mes atsortingbuts et utilitaires personnalisés en tant que méthodes d’extension, infrastructure de validation générique. Cela détermine l’organisation du comportement général de mon application .net finale.

2.) Application.DataModel

  • XSD Typed Dataset pour la firebase database.
  • TableAdapters étendu pour incorporer des transactions et d’autres fonctionnalités dont j’ai éventuellement besoin.

3.) Application.DataAccess

  • Classes d’access aux données.
  • Lieu réel où les actions de firebase database sont interrogées à l’aide d’un jeu de données typé sous-jacent.

4.) Application.DomainObjects

  • Objets métier et collections d’objects métier.
  • Enums.

5.) Application.BusinessLayer

  • Fournit des classes de gestionnaires accessibles à partir de la couche présentation.
  • HttpHandlers.
  • Ma propre classe de base de page.
  • Plus de choses vont ici ..

6.) Application.WebClient ou Application.WindowsClient

  • Ma couche de présentation
  • Prend des références à partir de Application.BusinessLayer et Application.BusinessObjects.

Application.BusinessObjects sont utilisés dans l’application et se déplacent dans toutes les couches chaque fois que cela est nécessaire [sauf Application.DataModel et Application.Infrastructure].

Toutes mes requêtes sont définies uniquement Application.DataModel.

Application.DataAccess retourne ou prend des objects Business dans le cadre de toute opération d’access aux données. Les objects métier sont créés à l’aide d’atsortingbuts de reflection. Chaque object métier est marqué avec un mappage d’atsortingbut à la table cible dans la firebase database et les propriétés de l’object métier sont marquées avec un mappage d’atsortingbuts à la colonne cible dans la table de firebase database respective.

Mon cadre de validation me permet de valider chaque champ à l’aide de l’agent de validation désigné.

Mon travail utilise principalement des atsortingbuts pour automatiser la plupart des tâches fastidieuses telles que la cartographie et la validation. Je peux aussi créer de nouvelles fonctionnalités en tant que nouvel aspect du cadre.

Un exemple d’object métier ressemblerait à ceci dans mon application.

Utilisateur.cs

[TableMapping("Users")] public class User : EntityBase { #region Constructor(s) public AppUser() { BookCollection = new BookCollection(); } #endregion #region Properties #region Default Properties - Direct Field Mapping using DataFieldMappingAtsortingbute private System.Int32 _UserId; private System.Ssortingng _FirstName; private System.Ssortingng _LastName; private System.Ssortingng _UserName; private System.Boolean _IsActive; [DataFieldMapping("UserID")] [DataObjectFieldAtsortingbute(true, true, false)] [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")] public override int Id { get { return _UserId; } set { _UserId = value; } } [DataFieldMapping("UserName")] [Searchable] [NotNullOrEmpty(Message = "Username Is Required.")] public ssortingng UserName { get { return _UserName; } set { _UserName = value; } } [DataFieldMapping("FirstName")] [Searchable] public ssortingng FirstName { get { return _FirstName; } set { _FirstName = value; } } [DataFieldMapping("LastName")] [Searchable] public ssortingng LastName { get { return _LastName; } set { _LastName = value; } } [DataFieldMapping("IsActive")] public bool IsActive { get { return _IsActive; } set { _IsActive = value; } } #region One-To-Many Mappings public BookCollection Books { get; set; } #endregion #region Derived Properties public ssortingng FullName { get { return this.FirstName + " " + this.LastName; } } #endregion #endregion public override bool Validate() { bool baseValid = base.Validate(); bool localValid = Books.Validate(); return baseValid && localValid; } } 

BookCollection.cs

 ///  /// The BookCollection class is designed to work with lists of instances of Book. ///  public class BookCollection : EntityCollectionBase { ///  /// Initializes a new instance of the BookCollection class. ///  public BookCollection() { } ///  /// Initializes a new instance of the BookCollection class. ///  public BookCollection (IList initialList) : base(initialList) { } }