Pregunta

Mi pregunta es más de naturaleza arquitectónica, menos involucrada con la implementación real.

He creado una API basada en WCF, pero realmente no puedo decidir cómo separar el PL del BL. He reducido mi servicio para que solo tenga un mínimo de implementación, algo así como:

public TagItemResponse TagItem(TagItemRequest request)
{
   return (new ItemTagRequestProcessor()).GetResponse(request);
}

Entonces, por supuesto, surge la primera pregunta, ¿a qué capa pertenecen los RequestProcessors? Creo que sería un error llamarlos fachada, pero al mismo tiempo, no tienen nada que ver con la presentación. Por ahora, decidí que, sin embargo, pertenecían al PL. Los métodos de procesador toman mis DTO (DataContracts) como entrada, validan el mensaje de solicitud (clase base), se autentican (clase base) y eventualmente devuelven una sola respuesta DTO, así:

protected override void Process(TagItemRequest request, TagItemResponse response, Host host)
{
    var profile = ProfileFacade.GetProfile(host, request.Profile);
    var item = ItemFacade.GetItemId(host, request.Item);
    var tags = new List<Tag>();

    foreach (var name in request.Tags)
    {
        var tag = TagFacade.GetTag(profile, name);
        ItemFacade.TagItem(item, tag);
        tags.Add(tag);
    }

    ItemFacade.UntagItem(item, tags);
}

Ahora me pregunto, ¿por qué necesito las clases de fachada 1: 1 relacionadas con mis objetos comerciales? Por ejemplo, tengo una HostFacade que actúa como una capa entre el hostDAO y los procesadores. Sin embargo, tiene muy poca lógica, simplemente maneja las llamadas DAO.

public static Host GetHost(HostDTO dto)
{
   return HostDAO.GetHostByCredentials(dto.Username, dto.Password);
}

Pregunta: También podría fusionar los procesadores y las fachadas, ¿verdad?

He leído muchos artículos / libros sobre el tema, pero todavía no puedo establecer el camino "correcto" y tiendo a elegir un enfoque diferente cada vez que enfrento el problema. Me pregunto si incluso existe un enfoque correcto.

He encontrado f.ex. el ejemplo de doFactory, donde hablaron con las clases DAO directamente desde la implementación del servicio. Realmente no me gusta, ya que la mayoría de los métodos de ServiceContract comparten algo de lógica y, por lo tanto, se prestan bien para su uso con clases base compartidas.

También he encontrado otros ejemplos en los que solo se llaman las fachadas desde los servicios, pero eso parece funcionar bien solo para mensajes muy específicos. Mis mensajes son 'gordos' y compuestos para reducir la cantidad de llamadas al servicio tanto como sea posible. Mi capa de procesamiento adicional parece ser mi verdadero problema.

Probablemente no haya una respuesta única sobre cómo aplicar correctamente un servicio WCF, pero espero que haya algunos de ustedes con una opinión que conformará mis instintos o arrojará alguna nueva luz sobre el tema para mí.

¡Gracias!

Geoffrey

¿Fue útil?

Solución

Primero, supongo que por PL te refieres a la capa de presentación, ¿no a la capa de persistencia?

Al implementar un diseño de aplicación en capas, la pregunta principal siempre debe ser: ¿puedo reemplazar la implementación de una capa inferior sin afectar la implementación de la (s) capa (s) anterior?

Esto generalmente se ilustra mejor con la capa de persistencia. Si cambia de SQL Server 2008 a MySQL, por ejemplo, la capa de persistencia cambia (por supuesto). ¿Pero también son necesarios cambios en la capa empresarial? Por ejemplo, ¿la capa empresarial captura instancias de SqlException que solo son lanzadas por SqlClient? En un buen diseño, la capa empresarial no necesita ningún cambio.

El mismo principio debería aplicarse a la separación entre la capa empresarial y la capa de presentación.

En su ejemplo, diría que el ItemTagRequestProcessor no debería estar en la capa de presentación. Primero, no tiene nada que ver con la presentación, segundo, la implementación del procesamiento de una solicitud no es una preocupación para la capa de presentación. Compárelo con una aplicación web, presentar un TagItemResponse a un cliente es la preocupación de la capa web (presentación). Recuperar una instancia de <=> es asunto de una capa debajo de la capa de presentación.

Decidir si se debe tener una fachada entre su capa empresarial y la capa de persistencia es difícil. Por lo general, no implemento una fachada porque agrega una capa adicional (generalmente innecesaria) de indirección. Además, no veo un problema al llamar a los métodos de la capa de persistencia directamente desde los métodos de la capa empresarial. Si solo tiene en cuenta el mismo principio: ¿puede cambiar la implementación de la capa de persistencia sin afectar la implementación de la capa empresarial?

Saludos cordiales,

Ronald Wildenberg

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top