Investigué un poco antes de publicar esta pregunta. Entre otras preguntas o publicaciones, una de ellas se proporciona a continuación. No pude tener una idea clara de cómo determinar ...
Business Objects dentro de una capa de acceso a datos
Tengo un repositorio y Business Layers llama al repositorio para recuperar los datos. Por ejemplo, supongamos que tengo las siguientes clases para BLL y DAL:
class BllCustomer
{
public int CustomerId {get; set;}
public String Name {get; set;}
public BllAddress Address {get; set;}
}
class BllAddress
{
public int AddressId {get; set;}
public String Street {get; set;}
public String City {get; set;}
public String ZipCode {get; set; }
}
class DalCustomer
{
public int CustomerId {get; set;}
public String Name {get; set;}
public int AddressID {get; set;}
}
class DalAddress
{
public int AddressId {get; set;}
public String Street {get; set;}
public String City {get; set;}
public String ZipCode {get; set; }
}
Si el BLL desea recuperar un objeto Cliente, llamaría a GetCustomerById (customerId) en DAL.
Las siguientes son mis preocupaciones, no pude tener una mente clara:
No puedo ver cómo determinar qué objeto debe devolver el GetCustomerById en DAL. ¿Debería devolver BllCustomer o DalCustomer?
¿Dónde debería estar la recuperación (y / o conversión a objeto comercial) de la dirección asociada con el cliente?
Si el DAL devuelve objetos Dal, entonces, la lógica para recuperar y completar la Dirección solo puede estar en el BLL. Si el DAL devuelve objetos BLL, entonces la lógica para recuperar y completar la Dirección puede estar en BLL o DAL. Actualmente, el DAL está devolviendo los Business Objects y la lógica para completarlo está en el DAL.
Por lo que leí, supongo que no hay correcto o incorrecto. Desde el enlace incluido anteriormente, hay personas que dicen de una manera y las otras dicen lo contrario. Pero, ¿cómo determino cuál funcionaría mejor para mi caso?
Cualquier ayuda sería apreciada.
fuente
Respuestas:
Debería devolver un objeto DalCustomer , devolver un objeto BllCustomer romperá el principio de responsabilidad única . Puede ver el objeto DalCustomer como la interfaz o contrato consumido por la capa empresarial (o consumidor). En efecto, si devuelve un BllCustomer, el DAL tendría que atender a cada objeto de la capa empresarial que lo llama o podría llamarlo.
La conversión debe hacerse en un modelo de vista o administrador. Debe tener un intermediario para llamar a su servicio o componente de acceso a datos. Si siente la necesidad, puede tener una conversión en su objeto BllCustomer . Pero luego, cuando cambia su DAL de MSSQL a Oracle, por ejemplo, su objeto (o interfaz) devuelto debe permanecer igual.
Preferiblemente, su capa empresarial también debe ser independiente de su capa de datos. La capa empresarial es responsable de sus reglas comerciales. Es aquí donde agregará sus validaciones utilizando un marco de validación para hacer cumplir sus reglas comerciales.
fuente
Su repositorio debe devolver el BLL o el objeto de dominio. es probable que no necesite un objeto DAL en absoluto.
fuente
Customer
?Típicamente, el DAL no tiene conocimiento del BLL. Piénselo de esta manera, una aplicación diferente con un BLL diferente podría usar el mismo DAL. Una aplicación / módulo Payables y una aplicación Receivables para la misma compañía compartirían datos (clientes, cargos, pagos, etc.). Intentar tener una DLL con conocimiento de más de una BLL sería muy difícil e innecesario. Esto también le permitiría cambiar su almacenamiento de datos sin impacto en el BLL (siempre que no rompa las interfaces).
Ahora puede pasar un objeto DAL al BLL o puede crear un tercer conjunto de objetos: Entidad. Estos contendrían solo los valores que se pasarían juntos. El DAL haría referencia a la entidad e interactuaría con su almacenamiento / base de datos y el BLL manejaría toda la lógica y haría referencia al DAL.
fuente
DAL debe ser independiente de BL y BL depende de DAL. Su interfaz de usuario solo debe acceder a los datos a través de BL. Es una buena práctica si devuelve DataTable o DataRow desde DAL y luego convierte DataTable / DataRow en objetos BL. Cuando su IU necesita acceder a los datos, puede acceder desde BL. Por lo tanto, la interfaz de usuario será independiente del nombre de la columna y el tipo de base de datos (SQL Server, Oracle ...). De esta manera, su interfaz de usuario será totalmente independiente de DAL. Personalmente, prefiero el nombre de la clase como "CustomerBL". No use la palabra BL al principio del nombre de la clase.
A continuación, ver Código de muestra.
fuente