none
Arquitectura DDD Capa de Servicio RRS feed

  • Pregunta

  • Hola a todos

    Tengo una duda, Segun la Arquitectura DDD En la capa de logica hay dos modulos uno de Entidades y uno de Contratos

    el modulo de contratos se encarga de definir las operaciones CRUD de la base de datos para Cada Entidad, esto es para separar la inplementacion de la capa de logica a la de capa de datos, asi no importa como implemente los datos en la capa de datos cualquier clase que implemtente la interface podre usarla eso me queda perfectamente claro.

    pero empeze a crear un servicio, y rersulta que el servicio lo manejas definiendo interfaces para implementar despues en clases, exactamente lo mismo que hice con la capa de negocio y la de datos, ahora podria yo usar la capa de datos para pasarla al servicio que define los metodos.

    pero entonces para que cree un modulo de contratos en la capa de logica y voy a tener que crearlo en la capa de servicios, alguna comentario o sugerencia de como se hace correctamente

    domingo, 12 de octubre de 2014 17:14

Respuestas

  • >>aunque yo sepa que hacen lo mismo realmente es lao misma definición.

    si aunque sea la misma definicion

    ya que la funcionalidad que cumple cada uno esta en diferentes etapas de la arquitectura, uno comunica presentacion con negocio, el otro negocio con la base de datos

    recuerda que la idea de separar als capas es para poder aplciar test en tu codigo


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta niqel domingo, 12 de octubre de 2014 23:06
    domingo, 12 de octubre de 2014 22:34

Todas las respuestas

  • >>Segun la Arquitectura DDD En la capa de logica hay dos modulos uno de Entidades y uno de Contratos

    en la arquitectura DDD no existe nada de eso, no se habla de ningun modulo

    >>ahora podria yo usar la capa de datos para pasarla al servicio que define los metodos.

    no entendi, que defines que metodos?

    >>para que cree un modulo de contratos en la capa de logica y voy a tener que crearlo en la capa de servicios

    a que llamas capa de logica o de servicios? porque puede que sea la misma cosa

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 12 de octubre de 2014 17:43
  • ok tratod e explicarlo mejor

    En al capa de Logica se crean dos proyectos uno de entidades, que son los objetos de la logica de negocio y un proyecto que tiene interfaces donde defino los metodos CRUD.

    si tengo la clase trabajador por ejemplo pues en la clase trabajador de la capa entidades manejo sus validaciones a sus propiedades con metodos get set.

    en el proyecto de contratos creo interfaces por ejemplo para trabajador creo la interface trabajador donde defino buscar(int id), Guardar(Trabajador trabajador) por ejemplo hay defino los metodos que utilizara el repositorio que es la capa de datos.

    mi duda es cuando se crea un servicio se definen los metodos en interfaces para crear la implementacion en otra parte. siendo esto sierto para que cree las interfaces en la capa de logica, si el servicio me va aexigir lo mismo.

    domingo, 12 de octubre de 2014 18:19
  • >>siendo esto sierto para que cree las interfaces en la capa de logica, si el servicio me va aexigir lo mismo.

    sigo si entender que diferencias aplcias entre la capa de logica y los servicios

    que codigo pones en la capa de logica y que codigo pones en los servicios?


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 12 de octubre de 2014 18:42
  • yo veo

    pues es asi

    1.- Proyecto de Presentacion

    1.1.- Asp.net

    2.- Proyecto de Aplicacion.

    2.1.- AspAplication

    3.- Proyecto de Servicios

    3.1.- //Aqui es donde cuando quise publicar los servicios me pide interfaces que son iguales al proyecto de Logica.Contartos

    4.- Proyecto de Logica.

    4.1.- Entidades

    4.2.- Contratos

    5.- Proyecto de Datos.

    5.1.- Repositorios

    que hay que hacer en ese caso???

    domingo, 12 de octubre de 2014 19:21
  • >>Aqui es donde cuando quise publicar los servicios me pide interfaces que son iguales al proyecto de Logica.Contartos

     en el proyecto de servicio debes referencia al proyecto de logica he implementar las interfaces de los contratos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 12 de octubre de 2014 19:50
  • Leandro pero me salio la misma, la implementacion de esos contratos ya los hago en la capa de Datos

    En el servicio nadamas quiero publicar lo que ya defini en la logica.Contratos y que ya implemente En los Datos.Repositorios 

    El detalle es que la regla de un servicio es que debe publicar Definiciones o contratos no implementaciones

    entonces yo creo un proyecto WCF library

    Hago Referencia a mi proyecto de logica.Contratos de todas maneras tendria que crear hay una interface y quizas hacerle la herencia a la Contratos y ya tendria una interface que tiene todo lo que tiene contratos por ejemplo

    yo en mi proyecto Logica.Contratos tengo una interface ITrabajador que define 4 metodos BUscar(), Guardar(), Actualizar(), Borrar()

    esa interface la te tengo que publicar en la libreria de WCF entonces hay creo una interface tambien y le paso la interface de contratos como herencia, asi ya no lo tengo que volver ha hacer,

    pero no los veo, como le modifico a la definicion para agregarle las etiquetas que pide un servicio lo que va en corchetes, si no lo veo, ojala y me de a entender

    domingo, 12 de octubre de 2014 20:18
  • >>esa interface la te tengo que publicar en la libreria de WCF entonces hay creo una interface tambien

    porque creas otro ?

    si logica.Contratos define las interfaces de los servicio de WCF entonces implementas estos para exponer los OpperationContract de WCF no debes crear otros nuevos

    >>como le modifico a la definicion para agregarle las etiquetas que pide un servicio lo que va en corchetes, si no lo veo

    que cosa no ves? te refieres a los atributos que requiere WCF

    si es asi agrega la referencia a System.ComponentModel (creo que era esta la libreria) para poder definir esos atributos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 12 de octubre de 2014 20:51
  • es que no tenia el código a la mano ya lo tengo para explicarme mejor

    mira el explorador de proyectos

    Ahora te voy a poner el código de una interface ICategoria

    public interface ICategoria
        {
            List<Categoria> Buscar();
            Categoria Buscar(int id);
            void Guardar(int id, string descripcion);
            void Guardar(Categoria categoria);
            void Guardar(List<Categoria> categorias);
            void Actualizar(int id, string nuevaDescripcion);
            void Actualizar(Categoria categorias);
            void Actualizar(List<Categoria> categorias);
            void Eliminar(int id);
            void Eliminar(List<int> ids);
            void Eliminar(List<Categoria> categorias);
        }


    ahora te voy a poner el RepositorioCategoria no esta todo implementado pero no tiene nada que ver con la duda

    public class RepositorioCategoria : RepositorioSqlServer, ICategoria
        {
    
            public List<Categoria> Buscar()
            {
                List<Categoria> lista = new List<Categoria>();
    
                using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["miConexion"].ConnectionString))
                {
                    using (SqlCommand cmd = new SqlCommand("spBuscarCategoria", cnn))
                    {
                        cmd.CommandType = System.Data.CommandType.StoredProcedure;
                        cnn.Open();
                        SqlDataReader miLector = cmd.ExecuteReader();
                        while (miLector.Read())
                        {
                            Categoria categoria = new Categoria() 
                            {
                                Id = Convert.ToInt32(miLector["id"]),
                                Descripcion = miLector["descripcion"].ToString()
                            };
                            lista.Add(categoria);
                        }
    
                    }
                }
                return lista;
            }
    
            public Categoria Buscar(int id)
            {
                throw new NotImplementedException();
            }
    
            public void Guardar(int id, string descripcion)
            {
                throw new NotImplementedException();
            }
    
            public void Guardar(Categoria categoria)
            {
                throw new NotImplementedException();
            }
    
            public void Guardar(List<Categoria> categorias)
            {
                throw new NotImplementedException();
            }
    
            public void Actualizar(int id, string nuevaDescripcion)
            {
                throw new NotImplementedException();
            }
    
            public void Actualizar(Categoria categorias)
            {
                throw new NotImplementedException();
            }
    
            public void Actualizar(List<Categoria> categorias)
            {
                throw new NotImplementedException();
            }
    
            public void Eliminar(int id)
            {
                throw new NotImplementedException();
            }
    
            public void Eliminar(List<int> ids)
            {
                throw new NotImplementedException();
            }
    
            public void Eliminar(List<Categoria> categorias)
            {
                throw new NotImplementedException();
            }
        }


    ahora las capas deben estar desacopladas ahora sigue mi capa de servicio

    tu me propones que haga una referencia en el servicio a la capa de lógica al proyecto de contratos y yo hice esto

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Entidades;
    using Contratos;
    
    namespace ServicioChefAdministrador
    {
        public interface IServicioCategoria : Contratos.ICategoria
        {
        }
    }


    de esta forma la interface del servicio contiene las definiciones de contratos y estaría bien

    pero las definiciones de la interface ICategoria de contratos son generales osea no son exlusivas para un servicio por eso en la capa de lógica no puedo agregarles estos atributos

    [

    ServiceContract]

    ni tampoco

    [

    OperationContract]

    como hago para que esta interface

    public interface IServicioCategoria : Contratos.ICategoria
        {
        }
    pusisera esas etiquetas ojala y me explique bien

    domingo, 12 de octubre de 2014 21:16
  • >>tu me propones que haga una referencia en el servicio a la capa de lógica al proyecto de contratos y yo hice esto

    no eso esta incorrecto porque las interfaces a las que haces referencia definen la funcionalidad del repositorio

    para los servicios debes definir otra interfaz distinta

    no puedes usar ICategoria como interfaz para los servicio debes crear otra interfaz, porque es la interfaz de WCF la que quieres definir que sera diferente a la interfaz que use el repositorio

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    domingo, 12 de octubre de 2014 21:42
  • aunque yo sepa que hacen lo mismo

    realmente es lao misma definición.

    domingo, 12 de octubre de 2014 22:00
  • >>aunque yo sepa que hacen lo mismo realmente es lao misma definición.

    si aunque sea la misma definicion

    ya que la funcionalidad que cumple cada uno esta en diferentes etapas de la arquitectura, uno comunica presentacion con negocio, el otro negocio con la base de datos

    recuerda que la idea de separar als capas es para poder aplciar test en tu codigo


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta niqel domingo, 12 de octubre de 2014 23:06
    domingo, 12 de octubre de 2014 22:34