none
Modelo en tres capas (datos, negocio y presentación)

    Question

  • Buenas a todos
    Estoy implementando un modelo en 3 capas (datos, negocio y presentación) en c#

    La capa de datos es LINQ to SQL en la que tengo una tabla (articulos) con la siguiente definición para SQLServer 2005:

    CREATE TABLE [dbo].[Articulos](
    	[PKRef] [int] IDENTITY(1,1) NOT NULL,
    	[Ref] [nvarchar](50) NOT NULL,
    	[Descripcion] [nvarchar](200) NOT NULL,
    	[PrecioVenta] [float] NOT NULL,
     CONSTRAINT [PK_Referencias] PRIMARY KEY CLUSTERED 
    (
    	[PKRef] ASC
    ) ON [PRIMARY]
    ) ON [PRIMARY]

    El soporte es SQLServer2005

    Se llama Ventas.dbml

    La capa de negocio tiene una clase que se llama Articulos, con la siguiente definición:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using datos;
    
    namespace Negocio
    {
        public class Articulos
        {
            private datos.VentasDataContext _articulos;
    
            public Articulos()
            {
                _articulos = new datos.VentasDataContext();
            }
    
            public class estructura : _estructura
            {
            }
    
            public object Obtener()
            {
                var pp = (from a in _articulos.Articulos
                          select a);
                return pp;
            }
        }
    }


    La clase estructura me sirve para saber la estructura valga la redundancia que tiene la tabla articulos
    He agregado una referencia a datos desde negocio y a negocio desde presentacion
    El problema viene en la presentacion, para probar he hecho un sencillo proyecto winform al que asigno un origen de datos de objeto a la clase estructura para tenerla y ´de forma fácil 'echr' las propiedades al formulario creando el VS 2008 el bindingsource y el bindingnavigator aparte de los controles enlazados a los campos del bindingsource, hasta aqui todo bien, lo que sucede es que cuando lo ejecuto me dice esto:
    El tipo 'datos.Articulos' está definido en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado 'datos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' en el proyecto Presentacion

    Claro si añado la referencia a datos se soluciona la cosa pero se invalida el modelo en 3 capas.

    He desarrollado el mismo esquema en VB con la misma tabla e igual todo y funciona al pelo, es decir bien, no se que sucede.

    Si me podeis ayudar os lo agradezco.

    Gracias a todos de antemano

    Saturday, May 23, 2009 5:54 PM

Answers

  • Hola
    Necesariamente tienes que agregar una referencia a tu capa de acceso a datos en los form para poder acceder a los EntitySet, la unica forma es que tengas una capa adicional de Entidades de Negocio

    namespace Entidades
    {
       public class Articulo()
       {
          public int Codigo{get;set;}
          public string Referencia{get;set;}
          // Todas las demas propiedades
       }
    }
    



    Luego en tu capa de Acceso a Datos:
    namespace AccesoDatos
    {
       public class ArticulosDAL()
       {
          public IEnumerable<Entidades.Articulo> ObtenerArticulos()
          {
              TuDataContext _context = new TuDataContext();
              var qry = from a in _context.Articulos
                             select new Entidades.Articulo()
                             {
                                 Codigo = a.PKRef,
                                 Nombre = a.Ref
                              };
                return qry.AsEnumerable();
           }
    }
    


    Saludos


    Si la respuesta es correcta, marcala como correcta

    DCE 5 ESTRELLAS PLATINO

    • Marked as answer by Fisli Sunday, May 24, 2009 7:57 AM
    Saturday, May 23, 2009 7:52 PM
  • Que tal, yo haria lo siguiente :

    namespace AccesoDatos
    {
        public class ArticulosDAL
        {
       public List<
    Articulo > Listar()
            {
                List<Articulo> lista = new List<Articulo>();
                try
                {
                    TuDataContext dc =   new TuDataContext();

                    var query = dc.uspListarArticulos();
                    foreach (var item in query)
                    {
                        lista.Add(new Articulo()
                        {
                            Codigo = item.PKRef,
                            Nombre = item.Ref
                        });
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return lista;
            }
        }
    }

    Espero que te haya sido util.
    Saludos.
    El hombre mas poderoso del mundo es aquel que es dueño de si mismo
    • Marked as answer by Fisli Sunday, May 24, 2009 7:57 AM
    Sunday, May 24, 2009 1:31 AM

All replies

  • Hola
    Necesariamente tienes que agregar una referencia a tu capa de acceso a datos en los form para poder acceder a los EntitySet, la unica forma es que tengas una capa adicional de Entidades de Negocio

    namespace Entidades
    {
       public class Articulo()
       {
          public int Codigo{get;set;}
          public string Referencia{get;set;}
          // Todas las demas propiedades
       }
    }
    



    Luego en tu capa de Acceso a Datos:
    namespace AccesoDatos
    {
       public class ArticulosDAL()
       {
          public IEnumerable<Entidades.Articulo> ObtenerArticulos()
          {
              TuDataContext _context = new TuDataContext();
              var qry = from a in _context.Articulos
                             select new Entidades.Articulo()
                             {
                                 Codigo = a.PKRef,
                                 Nombre = a.Ref
                              };
                return qry.AsEnumerable();
           }
    }
    


    Saludos


    Si la respuesta es correcta, marcala como correcta

    DCE 5 ESTRELLAS PLATINO

    • Marked as answer by Fisli Sunday, May 24, 2009 7:57 AM
    Saturday, May 23, 2009 7:52 PM
  • Que tal, yo haria lo siguiente :

    namespace AccesoDatos
    {
        public class ArticulosDAL
        {
       public List<
    Articulo > Listar()
            {
                List<Articulo> lista = new List<Articulo>();
                try
                {
                    TuDataContext dc =   new TuDataContext();

                    var query = dc.uspListarArticulos();
                    foreach (var item in query)
                    {
                        lista.Add(new Articulo()
                        {
                            Codigo = item.PKRef,
                            Nombre = item.Ref
                        });
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return lista;
            }
        }
    }

    Espero que te haya sido util.
    Saludos.
    El hombre mas poderoso del mundo es aquel que es dueño de si mismo
    • Marked as answer by Fisli Sunday, May 24, 2009 7:57 AM
    Sunday, May 24, 2009 1:31 AM
  • Al parecer tu arquitectura no tiene nada que ver, ¿Agregaste la referencia a Linq?

    System.Data.Linq

    Saludos,
    Profesionista Microsoft VIP México
    Blog Técnico
    Small Business Website
    World Wide Finalist Imagine Cup 2007
    Microsoft Student Partner
    C#, WPF, WCF
    LinkedIn
    Sunday, May 24, 2009 5:10 AM
  • Las soluciones de Pedro Marquez y FAFNER son muy similares y lo que me comentais es abstraer la capa de datos con una intermedia, de esta forma se soluciona la 'visibilidad' de la referencia a la capa de datos, aunque debo añadir una referencia a la capa intermedia Entidades desde presentación que no me gusta mucho, pero bueno ya está abstraida la capa de datos. Lo que me resulta curioso es que el mismo modelo en VB  funciona perfectamente y no entiendo por qué.

    Gracias a todos

    Sunday, May 24, 2009 7:57 AM
  • hola,

    que tal, añado algunos links de ejemplos de desarrollo en capas que pueden llegar a interesar:

    3-tier architecture in C#

    Coding an N-Tier Application in C# without any Wizard Part I

    Building an N-Tier Application in VB.NET, in 8 Steps


    coincido con lo que dice Pedro, si quieres evitar que tu capa de presentacion tengra acceso a la de datos, deberias separar tus entidades en un nuevo proyecto de VS.

    De esta forma desde tu presentacion solo agregarias referencia a este y el de negocio.


    saludos
    Leandro Tuttini
    Sunday, May 24, 2009 7:33 PM
  • Hola
    En este hilo respondi en algo parecido pero usando MySQL Server y Datasets, hasta un video prepare y lo subi a SkyDrive
    Saludos
    Si la respuesta es correcta, marcala como correcta

    DCE 5 ESTRELLAS PLATINO

    Sunday, May 24, 2009 7:57 PM