2011-10-03 59 views
6

Estoy construyendo una aplicación con la siguiente arquitectura:En DDD dónde guardar excepciones personalizadas (excepciones de la aplicación)? En la capa de infraestructura?

UI - Aplicación - Dominio - Infraestructura

Tengo una capa de aplicación que necesita usar excepciones personalizadas. Donde guardo estas excepciones personalizadas? En la capa de infraestructura? El problema es que mi capa de aplicación no tiene referencia a la capa de infraestructura.

¿Cuál es la forma correcta?

Actualización:

Aquí está mi código que lanzar una excepción en la capa de aplicación:

public void InsertNewImage(ImagemDTO imagemDTO) 
{ 
    if (isValidContentType(imagemDTO.ImageStreamContentType)) 
    { 
     string nameOfFile = String.Format("{0}{1}", Guid.NewGuid().ToString(), ContentTypeHelper.GetExtension(imagemDTO.ImageStreamContentType)); 

     string path = String.Format("{0}{1}", ImageSettings.PathToSave, nameOfFile); 

     _fileService.SaveFile(imagemDTO.ImageStream, path); 

     Imagem imagem = new Imagem() 
          { 
           Titulo = imagemDTO.Titulo, 
           Descricao = imagemDTO.Descricao, 
           NomeArquivo = nameOfFile 
          }; 

     _imagemRepository.Add(imagem); 

     _dbContext.SaveChanges(); 
    } else 
    { 
     throw new WrongFileTypeException(String.Format("{0} is not allowed.", ContentTypeHelper.GetExtension(imagemDTO.ImageStreamContentType))); 
    } 
} 

Incluso ImageSettings es un ConfigurationSection está en mi capa de aplicación, ya que lo utiliza. No veo otra manera de transferir mis ImageSettings (que deberían permanecer en Infrastrucuture Layer) a Infrastructure Layer, ¿alguien puede ayudarme?

public class ImageSettings : ConfigurationSection 
{ 
    /// <summary> 
    /// Caminha onde será salvo as imagens 
    /// </summary> 
    [ConfigurationProperty("pathToSave", IsRequired = true)] 
    public string PathToSave 
    { 
     get { return (string)this["pathToSave"]; } 
     set { this["pathToSave"] = value; } 
    } 

    /// <summary> 
    /// Extensões permitidas pra upload 
    /// </summary> 
    [ConfigurationProperty("allowedExtensions", IsRequired = true)] 
    public string AllowedExtensions 
    { 
     get { return (string)this["allowedExtensions"]; } 
     set { this["allowedExtensions"] = value; } 
    } 

    /// <summary> 
    /// Tamanho das imagens 
    /// </summary> 
    [ConfigurationProperty("imageSize")] 
    public ImageSizeCollection ImageSize 
    { 
     get 
     { 
      return (ImageSizeCollection)this["imageSize"]; 
     } 
    } 
} 

Respuesta

0

¿Tiene una capa donde se abordan temas transversales (como la tala o la inyección de dependencia) y que se hace referencia a todos los otros proyectos en su solución? Si es así, aquí es donde debería poner estas excepciones personalizadas. Supongo que por "capa de infraestructura" realmente te refieres a esta capa transversal, pero si es así, parece extraño que tu capa de aplicación no esté haciendo referencia a ella.

Como alternativa, podría mantener estas excepciones en la propia capa de la aplicación, siempre que estas excepciones sean utilizadas solo por esa capa y quizás también por la capa de la interfaz de usuario.

+0

aplicación de referencia de infraestructura. Aplicación no referencia IN infraestructura. Creo que este es el correcto ... –

0

Esto probablemente esté relacionado con su previous question. Las excepciones son parte del contrato que está definido por la capa de aplicación y está implementado por la infraestructura (DIP y Onion architecture). Deben definirse en términos de Appliction y manejarse por la Aplicación, pero deben arrojarse desde la Infraestructura. Por ejemplo, en el código de aplicación:

public class NotificationException : Exception {...} 

public interface ICanNotifyUserOfSuccessfullRegistration { 
    /// <summary> 
    /// ... 
    /// </summary> 
    /// <exception cref="NotificationException"></exception> 
    void Notify(); 
} 

Y en Infraestructura:

public class SmsNotificator : ICanNotifyUserOfSuccessfullRegistration { 
    public void Notify() { 
     try { 
      // try sending SMS here 
     } catch(SmsRelatedException smsException) { 
      throw new NotificationException(
          "Unable to send SMS notification.", smsException); 
     } 
    } 
} 
+0

su escenario es muy diferente de mi escenario ... ver la actualización, por favor ... –

0

Acaz Souza - que está diciendo incorrecta en referencia a la capa de aplicación shouldnt la capa de infraestructura. Le sugiero que lea "Diseño controlado por el dominio rápidamente", que está disponible de forma gratuita en InfoQ.

Mire el siguiente diagrama, que ilustra mi punto.

Gracias

Domain Driven Design - Layers

+0

Hola, Ronnie, este diagrama no es un diseño impulsado por dominio, como yo lo entiendo, está impulsado por la infraestructura. .domain objects (projects) no deberían tener una dependencia en la infraestructura en DDD .. usando ORM para ** Generar ** clases y entidades POCO no requiere una dependencia de proyecto en Infraestructura (Capa de Acceso a Datos), es un pre -procesamiento, preocupación previa a la construcción ... –

+0

En lo que concierne a la dependencia de la aplicación en Infraestructura ... esa infraestructura parece abarcar inquietudes más allá de la implementación de servicios de dominio y aplicaciones y acceso a servidores sql, puertas de enlace, etc. Esto es, 'System.Net.HttpContext' es no forma parte de ** My ** capa de infraestructura, pero ciertamente es algo de lo que depende mi capa de aplicación. Así que solo puedo suponer que este diagrama está designando ensamblados de .NET Framework como parte de la capa de infraestructura. pero eso no es una infraestructura que está implementando algo en su dominio ... por lo que es dudoso. –

+0

En el libro "Diseño controlado por el dominio rápidamente", los ejemplos tienen la capa de aplicación que hace referencia a la capa de infraestructura, p. "La capa de aplicación es una capa delgada que se interpone entre la interfaz de usuario, el dominio y la infraestructura. Interactúa con la infraestructura de la base de datos durante las operaciones de inicio de sesión, etc." (página 39) – Ronnie

Cuestiones relacionadas