none
Proyecto MVC n-capas RRS feed

  • Pregunta

  • Hola

    Estoy trabajando en un proyecto ASP.NET MVC 4 el cual la estructura es un n-capas, en la capa de Aplicación tengo una capa de Adaptadores(Dto)

    Las clases dto's son mis Models que deberían estar en la capa de presentación, pero escoji ponerlos en una capa de Adaptadores.

    Mi pregunta es si ¿Tener los modelos en otra capa me limita de hacer algunas cosas? como poder implementar en mi objeto ProveedorDto la propiedad SelectList, la cual me pide importar el namespace using System.Web.Mvc;

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    
    namespace Prueba.Adaptadores
    {
        public class ProveedorDto
        {
            [Key]
            public int ProveedorId { get; set; }
    
            [Display(Name = "Razón Social")]
            public string RazonSocial { get; set; }
    
            [Display(Name = "Dirección")]
            public string Direccion { get; set; }
    
        }
    }
    

    ¿Sería una limitación en mi arquitectura tener los models en otra capa?


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 23 de diciembre de 2016 4:59

Todas las respuestas

  • >>Las clases dto's son mis Models que deberían estar en la capa de presentación, pero escoji ponerlos en una capa de Adaptadores.

    no creo que quede claro poner entidades de transporte en un proyecto de adaptadores

    es mas que es un adaptador ? porque parecen ser alguna funcionalidad que convierte, pero no creo que crees algo como eso

    quizas alli es donde usas automapper para convertir las clases de dto en las entidades de dominio ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 23 de diciembre de 2016 15:02
  • Hola Leandro.

    No creo que quede claro poner entidades de transporte en un proyecto de adaptadores
    es mas que es un adaptador? porque parecen ser alguna funcionalidad que convierte, pero no creo que crees algo como eso.

    Lo hice basandome en Arquitectura N-Capas

    Quizas alli es donde usas automapper para convertir las clases de dto en las entidades de dominio?

    El automapper lo aplico en la capa de Servicios Aplicación, como por ejemplo.

    public class SaProveedor : ISaProveedor
        {
            
            private readonly SdProveedor _sdProveedor = new SdProveedor();
            private MapperConfiguration config;
    
            public IEnumerable<ProveedorDto> GetAll()
            {
                IEnumerable<Proveedor> _proveedor = _sdProveedor.GetAll();
                config = new MapperConfiguration(cfg => cfg.CreateMap<Proveedor, ProveedorDto>());
                IEnumerable<ProveedorDto> listDto = config.CreateMapper().Map<IEnumerable<ProveedorDto>>(_proveedor);
                return listDto;
            }
    }

    Los modelos(Models[MVC]) los creo con mis clases Dtos, tuve la necesidad de cargar unDropDownList, veo que hay muchas manera de crearlos y cargarlos enlazados a datos.

    También hay una propiedad que se llama SelectListItem la cual me pide el namespace using System.Web.Mvc; pero al estar mi clase modelo(Dtos) en otra capa no puedo aplicar el namespace en mención, por eso digo si es una desventanja tener los Dtos en otra capa, y también si es valida la arquitectura que planteo.

    Las entidades del dominio no deben llegar a la capa de presentación, por eso fue que implemente la capa Adaptadores. Y aplico Automapper en la capa de Servicios Aplicación.

    Me acabo de dar cuenta si no estoy equivocado SelectListItem es una propiedad de control y no sería valida ponerla en mi modelo.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila viernes, 23 de diciembre de 2016 20:27 .....
    viernes, 23 de diciembre de 2016 19:28
  • hola

    >>El automapper lo aplico en la capa de Servicios Aplicación,

    entonces cual es la responsabilidad del adaptador ?

    >>Los modelos(Models[MVC]) los creo con mis clases Dtos, tuve la necesidad de cargar unDropDownList, veo que hay muchas manera de crearlos y cargarlos enlazados a datos

    ok eso es correcto, las clases model que usas en las view las creas alli, claro que hay muchas formas dependiendo de lo que busques

    >>por eso digo si es una desventanja tener los Dtos en otra capa, y también si es valida la arquitectura que planteo.

    pero si defines el using a proyecto donde estan los dto deberias poder utilizarlos, es mas aunque el codigo este en la view puedes definir el @using

    >>Las entidades del dominio no deben llegar a la capa de presentación, por eso fue que implemente la capa Adaptadores

    pero los dto no son adaptadores

    en la imagen dice "dto adapters" eso es para convertir los dto en alguna otra entidad, por eso decia que ali deberias poner la definicion de lo mapper de automapper, alli es donde defines el config con todos los mapper de la aplicacion y no definirlos en cada metodo del proveedor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    sábado, 24 de diciembre de 2016 3:14
  • Leandro

    ¿Como me sugieres que implemente los Dtos y en que capa ponerlos?, en realidad la responsabilidad del Adatador, uhmm solo ahí pongo las Dtos que son las clases de transporte.

    Cuando te refieres a @using te refieres al poderozo Razor.

    Tocando el tema del DropDownList tengo lo siguiente:

    Una clase Dto

    namespace Prueba.Adaptadores
    {
        public class ProveedorDto
        {
            [Key]
            public int ProveedorId { get; set; }
    
            [Display(Name = "Razón Social")]
            public string RazonSocial { get; set; }
    
            [Display(Name = "Dirección")]
            public string Direccion { get; set; }
        }
    }

    Acabo de crear una clase modelo en la carpeta Model del MVC

    namespace Prueba.UserInterfaceWeb.Models
    {
        public class ProveedorModel
        {
            public IEnumerable<SelectListItem> Proveedores { get; set; }
            public int SelectedProveedorId { get; set; }
        }
    }

    Y hago esto en el Controller

    public JsonResult Listar()
            {
                var proveedores = _proveedorRepository.GetAll(); ==> proveedores es una lista de ProveedorDto
                var viewModel = new ProveedorModel
                {
                    Proveedores = proveedores
                    .Select(p => new SelectListItem { Text = p.RazonSocial, Value = p.ProveedorId.ToString() })
                };
                return Json(viewModel, JsonRequestBehavior.AllowGet);
            }

    Este proyecto es un proyecto para aprender MVC.

    Sobre la capa de Adaptadores la puedo eliminar y dentro de ServiciosAplicación pondría una carpeta Dtos en las cul pondría las clases de transporte Dto.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú






    • Editado Pedro Ávila sábado, 24 de diciembre de 2016 14:00 ...
    sábado, 24 de diciembre de 2016 3:25