Tengo un pequeño problema de arquitectura. En mi proyecto, tengo una capa de lógica de negocios (BLL) que contiene todas mis reglas comerciales, modelos y API OO para la interfaz. Cada objeto tiene métodos estáticos como getById que devuelven una instancia de dicho objeto. Cada objeto también tiene métodos como guardar y eliminar. Este es un código OO muy sencillo.Nivel de lógica empresarial Capa y acceso a datos: dependencia circular
Ahora tengo una capa de DataAccess (DAL), contenida en un espacio de nombre separado, para cada objeto BLL tengo una DataClass o "Repositorio" que ejecuta los comandos getById y save. Entonces, de alguna manera, los métodos save y getById de BLL son una capa delgada alrededor de los métodos de DataClass.
public static NewsItem GetByID(int id)
{
return DataFactory.GetNewsItemRepository().GetNewsItemById(id);
}
Para que las DataClasses devuelvan objetos BLL, necesitan conocer el BLL. por lo que ahora tenemos:
GUI ---> BLL < ----> DAL
El DataFactory sólo devuelve objetos que implementan una interfaz, por lo que puede ocultar los detalles de implementación como “OracleNewsItemRepository”.
Pero ahora lo que me molesta desde que comencé la programación orientada a objetos. En mi solución actual, tanto BLL como DAL necesitan conocerse entre sí. Esta es una Dependencia Circular, y es una buena práctica evitar dependencias circulares. También solo quiero exponer las interfaces (y mi DataFactory) y no mis clases. Esto se puede hacer colocando la capa DAL en un ensamble separado. Lo cual tendría sentido. Sin embargo, Visual Studio no permite que dos Ensambles se refieran entre sí. Otra pregunta sobre esto: C# internal access modifiers
De alguna manera creo que tengo mi patrón de acceso a datos completo mal. Parece que estoy convulsionando el patrón ActiveRecord con otras cosas como DataMappers. He pasado mucho tiempo en el sitio de Martin Fowler, pero esos patrones se describen muy genéricos y se ilustran con un diagrama UML muy abstracto.
No resuelven mi problema. Tal vez soy un poco anal, y no existe el "patrón perfecto de acceso a datos". Y lo que hago ahora no parece terriblemente mal. Pero cómo hago las cosas ahora, parece estar fuera de contexto ...
¿Alguna idea?
Trabajos, en combinación con DI. Mi BLL ahora solo conoce las interfaces. – IceHeat