2010-02-09 10 views
7

Mi objetivo es tener una aplicación que esté utilizando WPF y sea una arquitectura de 3 niveles. UI, BLL y DAL ... Me gustaría utilizar el MVVM, pero no estoy seguro de cómo funciona con una arquitectura de 3 niveles o si es algo completamente diferente. Así que con eso en mente, tengo algunas preguntas:MVVM con WPF usando LINQtoSQL en un DAL junto con un BLL

1) LINQtoSQL: He leído mucho en línea que dice LINQ reemplaza su DAL y he visto muchos artículos que dicen que esta es una mala idea. Estoy pensando que es una mala idea, sin embargo, ¿qué pongo aquí? ¿Cuáles son los tipos de datos que estoy devolviendo al BLL? IQueryable? ObservableCollection? No tengo ni idea.

2) El BLL: me gustaría hacer de esto un servicio que se ejecute en un servidor, de modo que cuando necesite hacer un cambio no necesite volver a implementar toda la aplicación, solo necesito reiniciar el Servicio. Pero no estoy seguro de por dónde empezar esto.

3) Con el BLL, supongo que estoy confundido sobre cómo los datos están pasando por todas las capas desde el DAL hasta la Interfaz.

He hecho muchas investigaciones en línea, y tengo cosas en blanco, pero no he visto a nadie hablar sobre una aplicación WPF que está utilizando MVVM con LINQ en el DAL usando SQLMetal y un BLL que se está ejecutando en un servidor. ¿Alguien puede señalarme en la dirección correcta? o tal vez un libro para obtener?

+0

"desafortunadamente, nuestra escuela no enseña tecnologías patentadas" lol – Will

Respuesta

2

Mike,

su pregunta es muy cool, me gusta. En primer lugar, siéntete libre de experimentar un poco: todos y cada uno de los proyectos son diferentes, por lo que no existe una única regla que se adapte a todas partes. Es por eso que sugeriría simplemente dejar DAL a LINQ 2 SQL. esta gran herramienta lo manejará, no tiene que preocuparse. En segundo lugar, mencionaste 3 Tier Arquitectura, pero ¿por qué no hay lugar para el Modelo? Como todos los modelos se generan automáticamente (por ejemplo, SQLMetal), tampoco tiene que preocuparse por las asignaciones. Por lo tanto, si usted no es aburrido, sin embargo, me deja de responder todas sus 3 preguntas:

  1. Saltar DAL y observo su proyecto CUIDADOSAMENTE - si usted tiene un sentimiento, que siente que carece de esta capa - añadirlo (se contendrá consultas LINQ2SQL). Y la segunda parte: puede devolver lo que desee, pero le resultará más conveniente utilizar IEnumerable <> o IQueryable <> parametrizado con sus modelos.

  2. Mi intuición me dice que va a necesitar WCF, en este caso debería ser capaz de envolver toda la lógica comercial (sí, eso es cierto) en un buen contrato e implementarlo como lo desee.

  3. Esta es la más fácil :) Dado que su capa BLL es en realidad una implementación de algún Contrato (Interfaz), puede diseñar esa Interfaz para proporcionarle todos los datos que necesita. Por ejemplo:

contrato/interfaz:

IEnumerable<User> GetTallUsersOver40(); 
IEnumerable<User> GetShortUsersOver60(); 
... 

y que 'todas las capas' que hablabas reducir a una sola ejecución de la consulta LINQ2SQL. Si necesita más lógica, colóquela en esta capa.

Quiero usar MVVM, ¿ahora qué? La respuesta es más simple de lo que crees: solo prepara tus vistas y ve modelos y simplemente consume tu implementación de Contrato/Interfaz BLL.

¡Por favor, pregunte si tiene más preguntas!

+0

¿El "Modelo" en Model-View-ViewModel es esencialmente el BLL que incluiré en WCF? – Mike

+0

No exactamente. Por favor piense en un Modelo de una capa separada hecha solo para mapear (o literalmente "modelar") sus datos persistentes. En resumen: Modelo es un conjunto de clases diseñadas para modelar su base de datos. Dado que LINQ 2 SQL hace modelos para usted (esto es simplemente genial), no se preocupe por esto, tiene todas las clases de modelado provistas :) si tiene más preguntas, no dude en preguntarlas. –

+0

Hmm ... Supongo que tengo problemas para visualizar las capas. Veamos si tengo este derecho. En la parte superior, tenemos la Vista que tiene un archivo .cs asociado que idealmente no contiene código. La vista se une al ViewModel, que es esencialmente un adaptador para la Vista. (Ahora aquí es donde empiezo a perder), dado que LINQtoSQL se encarga del modelo, ¿pongo una referencia/conexión al WCF BLL en cada ViewModel? Y finalmente, ¿el BLL hace referencia al DAL? Y el DataContext entra en el DAL? – Mike

2

Trataré de proporcionar alguna información, aunque no soy un experto, he abordado estos problemas en el pasado.

  1. LINQ to SQL es realmente bastante bueno en lo que se supone que debe hacer, que es reemplazar su DAL. Pero no devuelva un IQueriable hacia arriba a su BLL, ya que eso permitiría (o al menos daría pistas a la posibilidad) que el BLL consulte directamente su DB. Debe transferir el objeto de datos al BLL y dejar que construya un objeto comercial coincidente. También tenga en cuenta: LINQ en sí mismo se puede utilizar en cualquier capa (y de hecho es una de las mejores características de C#). LINQ to SQL es el mecanismo por el cual las declaraciones LINQ se transfieren a las consultas SQL.

  2. BLL como un servicio es una elección natural. Proporcione una interfaz ascendente a la capa de presentación (un servicio WCF es una buena opción aquí).

  3. El BLL genera objetos comerciales en función de los datos que recibe del DAL. Para proporcionar un buen desacoplamiento de las capas, debe usar diferentes clases para sus objetos DAL y BLL. No cree una dependencia entre su capa de presentación y su capa de datos.

0

Muy buena pregunta. No creo que haya un solo lugar que tenga todas las respuestas. Tenía preguntas muy similares cuando comenzamos un nuevo proyecto. MVVM es realmente solo un patrón de presentación y no le importan todos los detalles como usted mencionó. Laurent Bugnion tiene un buen marco que pega todo junto también.

  1. LINQ2SQL es genial, pero puede ser engorroso con los diseñadores de VS08. Echar un vistazo a http://plinqo.com/ de usar con CodeSmith para generar el DAL y yo creo que va incluso hacer el BLL con contratos también. Otra opción de generación es Oleg Sych T4 templates. Un problema con el que nos encontramos con LINQ2SQL es el contexto de datos singular. Si no necesita ser modular, esto no es un problema.

  2. Estoy de acuerdo con lo que dijeron los demás acerca de los contratos de datos y miro lo que Plinqo puede generar. Puede ahorrarte mucho tiempo.

  3. Los datos funcionarán normalmente en los objetos. Al igual que los demás, asegúrate de mantener una apariencia entre todas las capas para que no tengas dependencias.

Cuando llegue a la parte de MVVM, se abrirá una nueva lombriz de gusano. No creo que haya muchos o ningún libro en MVVM todavía. Todavía es una moda pasajera.

0

Una gran pregunta, estoy en las pendientes de la guardería de la curva de aprendizaje WCF/WPF, así que estoy en una posición similar a la tuya. Mis 2 centavos:

  1. No llegué a Linq a SQL, soy de la vieja escuela y solía escribir procedimientos almacenados y vistas. Actualmente los estoy usando para completar clases de DTO, es decir, clases sin métodos, solo propiedades para representar los datos. Sé que estoy probablemente detrás de la curva en esto.

  2. Haga su servicio BLL a WCF - ponga los contratos de servicio y contrato (s) de datos en su propio ensamblaje, luego puede incluir esto en su cliente, donde se convierten en su modelo o parte de él.

  3. En su aplicación cliente, incluya una referencia al conjunto que contiene los contratos de servicio y los contratos de datos.Los contratos de datos se convierten entonces en su modelo, sus ViewModels pueden envolver estos modelos y exponer sus propiedades (implementar INotifyPropertyChanged para enlace de datos).

Estoy usando los libros de O'Reilly Programando Servicios WCF, Aprendiendo Servicios WCF y Programando WPF que me parece bastante bueno. No conozco ningún libro específicamente sobre MVVM, pero hay muchas cosas en la web.

+0

¿Por qué hacer referencia al ensamblado BLL y no a un servicio web de WCF? ¿Por qué es necesario WCF entonces? –

Cuestiones relacionadas