un poco de contexto: Esto se refiere a mi deseo ciernes para construir aplicaciones web con múltiples capas: forma¿Cómo diseño una clase que contenga propiedades de tablas de búsqueda?
- C# ASP.NET Web negocio
- C# objetos POCO
- Algún tipo de DAL ... SQL (o tal vez EF4 si puedo averiguarlo)
realmente no lo desee una respuesta que tiene mi capa de presentación hablando directamente a las entidades de EF, por ejemplo.
He estado haciendo mi propio desarrollo web con C# ASP.NET & SQL durante 10 años, pero todavía soy un novato total cuando se trata de OOAD formal. He estado siguiendo esta habilidad con pasión últimamente, pero todavía soy nuevo en eso y hay algo que no puedo entender. Estoy esperando que alguien puede explicarlo de una manera que trae una epifanía:
Digamos que puedo crear una aplicación web que gestiona personas de alguna manera, y mi objeto persona debe poseer unas propiedades tales como Nombre, Apellido, Color de pelo, color de ojos, Etnia, StateOrProvince, etc. estoy usando SQL Server para la persistencia ... así que el sentido común dictaría que los respectivos campos de la tabla las personas son todas las claves externas:
FirstName varchar(50)
LastName varchar(50)
HairColor tinyint
EyeColor tinyint
Ethnicity tinyint
StateOrProvince tinyint
es evidente que esto significa que Tengo tablas de búsqueda correspondientes para cada uno de esos campos (es decir, la tabla HairColors, la tabla EyeColors, la tabla Ethnicities, etc.) y cada una de estas tablas de búsqueda tiene un ID y un nam mi. Por supuesto, el campo Nombre en estas tablas de búsqueda se UNIRÁ con mis datos de Gente cuando quiera mostrar algo útil sobre una Persona.
Algunas de las características clave del sitio sería:
1.) personas Enumerar en un Gridview (Nombre, Apellido, color de cabello, color de ojos, el origen étnico, StateOrProvince)
2.) Mostrar detalles de una persona individual en una página de sólo lectura (Nombre, Apellido, color de cabello, color de ojos, etnia, StateOrProvince)
3.) permitir a un usuario actualizar los datos de una persona individual en una página de actualización (Nombre, Apellido, color de cabello, color de ojos, Etnia, StateOrProvince)
Caso # 1 Si yo estaba enumerando una colección de objetos persona en un gridview ... cada instancia de persona tendría que mostrar su Las propiedades de HairColor, EyeColor, Ethnicity, StateOrProvince como cadenas tienen significado (es decir, el campo Nombre de la tabla de búsqueda de SQL, no su ID). Claramente mi sproc de SQL tendría algunos JOINs para darme los datos de cadena apropiados que necesito para completar estas propiedades de texto en cada instancia de Person.
Caso # 2 nuevo mi sproc tendría un JOIN para recuperar los nombres de las propiedades legibles como cadenas, y me los muestra en sólo controles Label leer usando algo como myPerson.HairColor, myPerson.EyeColor , etc.
Caso # 3 Aquí estaría mostrando una página con listas desplegables para cada una de estas propiedades (es decir, valor = HairColorId, Text = HairColorName). Mi instinto inmediato sería usar las identificaciones de cada propiedad (algo así como myPerson.HairColorId) para recorrer los elementos DDL y seleccionar un valor que represente el color de cabello que la tabla Personas tiene actualmente para esta Persona. Si el usuario seleccionó algo diferente en cualquiera de los DDL de la propiedad, necesitaría pasar los valores apropiados de SelectedId a un sproc de ACTUALIZACIÓN, y modificar los valores en la tabla de Personas para esta Persona en particular.
Así que me lleva a la última pregunta:
¿Cómo mejor diseño de un objeto Person de forma que contenga tanto el identificador y el nombre de color de cabello, color de ojos, Etnia, StateOrProvince así que puede posteriormente utilizar el nombre cuando muestra información, pero ID para inicializar la actualización Controles DDL ... y en última instancia procesamiento actualizaciones?
Como he reflexionado sobre esto ... he llegado a la conclusión de que necesito crear clases para representar las propiedades HairColor, EyeColor, Ethnicity, StateOrProvince.
Entonces mi clase de persona, en lugar de ser algo como esto:
public class Person
{
string FirstName { get; set; }
string LastName { get; set; }
int HairColorId { get; set; }
string HairColorName { get; set; }
int EyeColorId { get; set; }
string EyeColorName { get; set; }
int StateOrProvinceId { get; set; }
string StateOrProvinceName { get; set; }
string StateOrProvinceCode { get; set; }
}
En vez de ello se ampliará en algo como esto:
public class HairColor
{
int Id { get; set; }
string Name { get; set; }
}
public class EyeColor
{
int Id { get; set; }
string Name { get; set; }
}
public class StateOrProvince
{
int Id { get; set; }
string Name { get; set; }
string Code { get; set; }
}
public class Person
{
HairColor HairColor { get; set; }
EyeColor EyeColor { get; set; }
StateOrProvince StateOrProvince { get; set; }
public Person()
{
// how do I initialize a Person from a SQL data row?
}
}
Pero entonces, si mi clase de persona se parece a los anteriores ... ¿cómo diablos puedo inicializarlo (ya sea individualmente o en una colección) a partir de una fila dada de datos que obtengo de una consulta SQL? Me parece recordar que no debería estar renovando cosas en un constructor (es decir, this.HairColor = new HairColor (dr ["HairColorId"), dr ["HairColorName"];) ... así que me pregunto cómo llamar a
public static IEnumerable<Person> GetPeople()
{
...
}
en mi BLL podría llenar a cada usuario con sus datos antes de que se agregue a la colección?
realmente esperando que alguien me puede dar un momento "a-ha" aquí ...
Gracias. Encapsular StateOrProvince en una clase de dirección es correcto en el dinero.Creo que ese hubiera sido mi próximo paso lógico una vez que comencé a construir esto. Sin embargo, nunca pensé dar un paso más con "PersonTraits" porque está muy lejos del esquema DB. Supongo que estoy demasiado acostumbrado a pensar en términos de mi modelo SQL que no puedo liberar mi mente para pensar en un modelo de objetos. – octechnologist
¿Sugeriría que use un ORM? Me metí con EF4 como DAL en un sitio de prueba anterior hace aproximadamente 6 meses ... pero no creo que estuviera mentalmente preparado para eso. Estoy llegando a un punto con mi comprensión de OOP que podría tener más sentido para mí ahora. – octechnologist
Claro, un ORM como EF4 es muy poderoso y te ayudaría con muchas tareas repetitivas (como el mapeo que he descrito). Lo importante es mantener su arquitectura flexible y tener persistencia como una sola capa intercambiable. Eche un vistazo [aquí] (http://blogs.msdn.com/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-experience.aspx) para alguna orientación. Además, descubrí que el libro "Diseño impulsado por el dominio" es realmente importante para comprender este tipo de separación y cómo modelar sus entidades. –