Pregunta

Actualmente estoy atascado en el diseño de esta solución.

El diseño de la capa de datos consta de lo siguiente:

  • Receta (objeto principal de alto nivel)
    • Detalle del idioma (nombre, descripción por idioma) (muchos)
      • Encabezados (muchos)
      • Pasos (muchos)
        • Ingredientes (muchos)
        • Cantidades (muchas)
        • Procedimientos (muchos)
      • Notas (muchas)

El desafío que tengo es cómo crear un diseño de acceso a datos que agregue / elimine los objetos secundarios en la base de datos cuando el objeto se rellene con un método de receta (receta) de WCF.

Todo esto proviene de la administración que nos pide que agreguemos una capa de comunicaciones en nuestra aplicación, en este momento nuestra interfaz de usuario está acoplada a nuestra capa de negocios, y el BL está directamente acoplado a la DAL, básicamente necesitamos la inyección de WCF entre los BL y DAL.

He leído en este hilo que usar L2S no es una buena idea en WCF, pero ya que el diseño no es nuevo, tenemos que usar este tipo de metodología y luego alejarnos de él una vez que podamos refactorizar las grandes cantidades de trabajo de IU.

¿Fue útil?

Solución

Si está intentando enviar cosas por la línea con WCF, le sugiero que cree un modelo de los datos que desea mover alrededor de su dominio. Por lo que he descubierto, no puede serializar objetos IQueryable, pero puede crear un conjunto de clases que rellena Linq y luego serializarlo. Por ejemplo:

[DataContract]
public class Recipe {

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public List<Ingredient> Ingredients { get; set; }

}

Luego llene eso con

List<Recipe> recipes = (from r in dc.recipe
                           select new Recpie {
                               Name = r.name,
                               Description = r.description,
                               Ingredients = (Linq code to make list of ingredients)
                           }).ToList();

Y luego, enviar la lista por la línea con WCF se convierte en un pedazo de pastel.

Otros consejos

Me gusta esta respuesta de Karl en el hilo al que hizo referencia:

  

Es mejor crear tu propio   Clases para la transferencia de datos.   objeto. Esas clases, por supuesto,   sería implementado como DataContracts.   En tu capa de servicio, convertirías   entre los objetos linq-to-sql y   instancias de los objetos portadores de datos.   Es tedioso pero desacopla el   clientes del servicio de la   esquema de la base de datos. También tiene la   ventaja de darte un mejor control   de los datos que se transmiten en   su sistema.

Parece que tendrás que refactorizar de todos modos, así como empezar refactorizando la dependencia de linq2sql en tu capa de UI.

No creo que tengas una solución rápida y fácil.

No recomiendo exponer las clases de L2S a través de WCF. Cree una jerarquía de objetos DataContract y páselos a través de WCF. La desventaja de esto es que tienes que " copia profunda " sus objetos L2S en su jerarquía de DataContract, pero la ventaja es que solo puede incluir campos que sean necesarios y adecuados para el transporte a través de una red. Por ejemplo, en un proyecto en el que estoy trabajando ahora, paso un objeto EmployeeData a través de la red que incluye la mayoría de los campos de Empleado de L2S, pero excluye elementos como el hash y amp salados del empleado; contraseña de sal.

También podría ser una idea crear clases que incluyan y excluyan entradas secundarias. Algunas veces he creado clases como esta:

class Recipe {
    [DataMember] public string Name;
    [DataMember] public string Description;
}

class RecipeWithIngredients : Recipe {
    [DataMember] public IList<Ingredient> Ingredients;
}

Editar: publicado inadvertidamente antes de que finalice la publicación.

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