2011-01-19 19 views
5

Actualmente estoy escribiendo un raspador web que recupera información de Internet. Simplificado, se ve así.Mejor práctica de dependencia circular

proyecto de acceso de datos

  • objetos para recuperar los datos en bruto
  • objetos para analizar los datos en bruto en los objetos (!!)
  • Las entidades que el analizador devoluciones.

Ahora, estoy creando el analizador real, y voy a utilizar de esta manera:

using Application.DataAccess; 
using Application.DataAccess.Entities; 

namespace Application{ 
public class TestScraper{ 
    public static ScrapeIt() 
    { 
    var source = DataAcces.Retriever.Retrieve("http://example.com"); 
    DataAccess.Entities.Entity entity = DataAccess.Parser.Parse(source); 

    //Do stuf with source here. 
    } 
} 
} 

Como se puede ver, el analizador devuelve una Entidad. Sin embargo, esto está en el espacio de nombres de DataAccess, sin embargo, no tiene sentido ... es un círculo, y realmente no sé cómo solucionarlo. Bueno, podría llegar a algunas cosas, como crear otra capa entre esas capas.

Pero solo quiero saber cómo resolverías esto. Y lo que es bueno (o la mejor práctica) para esto.

+1

¿Por qué sus retrievers y análisis en el espacio de nombres de acceso a datos, seguramente no tienen nada que ver con el acceso a datos hasta que llegue a salvar la entidad? – Hawxby

+0

Lo siento, pero no veo el círculo. – SWeko

+0

@Beliskner He intentado compararlo con un SQL DAL. Las funciones que obtienen la información de los servidores SQL generalmente están en el DAL (comparable a mis recuperaciones), y las funciones que convierten los datos brutos en objetos utilizables también suelen estar en el DAL (comparable a mi analizador sintáctico). –

Respuesta

11

Puede corregir una referencia circular asignando los elementos a los que ambas clases hacen referencia en una nueva clase, y luego las clases antiguas se refieren a la nueva clase.

Por lo tanto, en su caso podría mover las entidades fuera de DataAccess y quizás en un nuevo espacio de nombres de Entidades, utilizado tanto por DataAccess como por la Aplicación.

Al hacer esto, empezar con

A <--> D 

y terminar con

A --> E 
D --> E 
+2

+1 - Así es como lo haría. Defina las dependencias comunes que crean la referencia circular y luego extráigalas. –

+0

puede dar un ejemplo de esto. ya que estoy confundido sobre si la nueva clase solo incluye la declaración de encabezado y si tiene su propia clase o solo declaración de encabezado? –

1

capa de acceso a datos no deben estar en el mismo espacio de nombres que sus objetos de dominio. Las entidades deben ser independientes en un espacio de nombres/ensamblaje que no haga referencia a ningún otro espacio de nombres, lo que permitirá que otras clases basadas en lógica, como DataAccess y Parsers, hagan referencia a la Entidad por sí mismas de una manera más limpia.