2010-01-20 11 views
6

Estoy tratando de comprender cuál es la mejor práctica al usar tablas XSD generadas a partir del esquema de base de datos que utilizo actualmente.Práctica recomendada al utilizar conjuntos de datos tipeados C# XSD En aplicaciones empresariales

1) ¿Crees que la información XSD debe ubicarse como parte del Modelo?

2) ¿Significa que Data Access Layer devuelve conjuntos de datos y otros objetos generados?

3) ¿Pasa por todas las capas del sistema hasta la interfaz de usuario?

4) Si el XSD es parte de la capa de acceso a datos, ¿debo convertir los resultados en objetos del modelo? ¿Cuál es la mejor metodología de conversión?

Gracias, Ronny

Respuesta

7

Se han restringido el propósito y las aplicaciones de XSDs haciendo XSDs específico para conjuntos de datos en su pregunta.

XSD es el acrónimo de Extensible Scehma Defination. Los estándares XSD están definidos por el W3C con el objetivo de estandarizar los archivos XML que puede usar en sus aplicaciones .

Como ejemplo digamos, usted está utilizando en gran medida archivos XML en su aplicación que puede intercambiar con diferentes tipos de fuentes remotas. Estas fuentes pueden enviarle archivos XML en varios formatos. En su aplicación, debe asegurarse de recibir el archivo XML en el formato adecuado para que pueda realizar aún más sus operaciones comerciales en el archivo XML. Por lo tanto, es necesario aplicar la estandarización a esos archivos XML. Deberá validar el archivo XML con los estándares aceptables de su parte. Deberá comparar el esquema de XML con los estándares. Estos estándares están escritos en formato XSD. Y validará el esquema de su archivo XML contra los estándares de esquema definidos en el archivo XSD. Este es el propósito real de los archivos XSD.

Ahora responder a sus preguntas ..

1.) ¿Cree que la información XSD debe estar ubicado como parte del Modelo?

Como acabo de ver, el archivo XSD almacena el esquema no los datos. De la misma manera en cualquier aplicación cuando se usan Conjuntos de datos que realmente almacenan datos en la memoria en tiempo de ejecución, también tendrá su propio esquema, la forma en que contendrá los datos. Esto varía según los Datatables subyacentes y sus relaciones. Entonces, los chicos de MS introdujeron el concepto de TypedDataSets. TypedDataSets: como su nombre indica, es un esquema calificado del Dataset que va a usar en tiempo de ejecución para jugar con los datos. Así que TypedDataSets en realidad se definen en forma de archivo XSD que define el esquema de DataTables y las relaciones entremedio. Por lo tanto, cuando crea un archivo TypedDataSet en Visual Studio, básicamente crea un archivo XSD. Se analizarán todas las tablas que agregue desde el origen de la base de datos a la superficie TypedDataSet, y se creará el esquema de metadatos de cada tabla en el archivo XSD. En tiempo de ejecución cuando selecciona registros en su conjunto de datos, ya sabe qué tipo de datos les están llegando y si los datos no están en la forma definida en el XSD obtendrá una excepción de tiempo de ejecución.

Aún XSDs no son instrumentales en tiempo de ejecución de Visual Studio becuase genera código base tpyed-conjunto de datos desde el archivo XSD utilizando XSD.exe tool.

2) ¿Significa que Data Access Layer devuelve conjuntos de datos y otros objetos generados?

Si su capa de datos usa TypedDataset, devolverá DataTables o DataRow [], o DataRow como lo necesite.

3) ¿Pasa por todas las capas del sistema hasta la interfaz de usuario?

Puede generar objetos de negocio personalizados encima, lo cual es una práctica recomendada en lugar de arrojar objetos de conjunto de datos aquí y allá en su aplicación.

4) Si el XSD es parte de la capa de acceso a datos, ¿debo convertir los resultados en objetos del modelo? ¿Cuál es la mejor metodología de conversión?

Escriba un mecanismo de mapeo utilizando Reflection. Asignamos nuestras instancias de objeto DataRow a Business y DataTables a colecciones de objetos de negocio.

Puede comenzar a rediseñar para mejorar su proyecto con una arquitectura más fácil de mantener. Y, por supuesto, esto llevará tiempo y esfuerzo, pero finalmente obtendrá grandes resultados.

Esto es lo que tengo en mi proyecto.

1.) Application.Infrastructure

  • Las clases base para todas las businessobjects, negocio objeto de colección, clases de datos de acceso y mis atributos personalizados y servicios públicos como los métodos de extensión, marco de validación genérico. Esto determina la organización del comportamiento general de mi aplicación .net final.

2.) Application.DataModel

  • XSD Typed conjunto de datos para la base de datos.
  • TableAdapters ampliado para incorporar Transacciones y otras funciones que pueda necesitar.

3.) Application.DataAccess

  • clases de acceso a datos.
  • Lugar real donde se consultan las acciones de la Base de datos utilizando el Dataset de tipografía subyacente.

4.) Application.DomainObjects

  • Los objetos de negocio y colecciones de objetos de empresa.
  • Enums.

5.) Aplicación.BusinessLayer

  • Ofrece clases de administrador accesibles desde la capa de presentación.
  • HttpHandlers.
  • Mi propia clase base de página.
  • Más cosas van aquí ..

6.) Application.WebClient o Application.WindowsClient

  • Mi capa de presentación
  • Toma referencias de Application.BusinessLayer y Aplicación. Objetos de negocio.

Application.BusinessObjects se utilizan en la aplicación y viajan a través de todas las capas cada vez neeeded [excepto Application.DataModel y Application.Infrastructure]

Todos mis consultas se definen solamente Application.DataModel.

Application.DataAccess devuelve o toma Business Objects como parte de cualquier operación de acceso a datos. Los objetos comerciales se crean con la ayuda de atributos de reflexión. Cada objeto comercial se marca con un mapeo de atributos a la tabla de destino en la base de datos y las propiedades dentro del objeto comercial se marcan con asignación de atributos a columna de destino en la tabla de base de datos respectiva.

Mi marco de validación me permite validar cada campo con la ayuda de ValidationAttribute designado.

Mi framrwork utiliza en gran medida atributos para automatizar la mayor parte de las tareas tediosas como la cartografía y la validación. También puedo nueva característica como nuevo aspecto en el marco.

una muestra objeto de negocio se vería así en mi solicitud.

User.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 DataFieldMappingAttribute 

    private System.Int32 _UserId; 

    private System.String _FirstName; 
    private System.String _LastName; 
    private System.String _UserName; 
    private System.Boolean _IsActive; 

    [DataFieldMapping("UserID")] 
    [DataObjectFieldAttribute(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 string UserName 
    { 
     get 
     { 
      return _UserName; 
     } 
     set 
     { 
      _UserName = value; 
     } 
    } 

    [DataFieldMapping("FirstName")] 
    [Searchable] 
    public string FirstName 
    { 
     get 
     { 
      return _FirstName; 
     } 
     set 
     { 
      _FirstName = value; 
     } 
    } 

    [DataFieldMapping("LastName")] 
    [Searchable] 
    public string 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 string 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

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

    /// <summary> 
    /// Initializes a new instance of the BookCollection class. 
    /// </summary> 
    public BookCollection (IList<Book> initialList) 
     : base(initialList) 
    { 
    } 
} 
+0

Gracias por el esfuerzo :) – Ronny

Cuestiones relacionadas