2011-10-03 19 views
6

我建立一個應用程序具有以下結構:DDD在哪裏保留自定義異常(應用程序異常)?在基礎設施層?

UI - 應用程序 - 域名 - 基礎設施

我有需要使用自定義異常一個應用層。我在哪裏保留這些自定義異常?在基礎設施層?問題是我的應用層沒有引用基礎設施層。

什麼是正確的方法?

更新:

這裏是我的代碼,在應用層拋出一個異常:

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))); 
    } 
} 

即使ImageSettings是一個配置節是我的應用層,因爲它使用它。我沒有看到其他方式將我的ImageSettings(應該保留在Infrastrucuture Layer中)轉移到基礎設施層,有人可以提供幫助嗎?

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"]; 
     } 
    } 
} 

回答

0

你有哪裏橫切關注點(比如日誌記錄或依賴注入)通過在解決方案中的所有其他項目處理和被引用的層?如果是這樣,這是你應該把這些自定義異常的地方。我想通過「基礎架構層」你實際上是指這個交叉層,但如果是這樣的話,你的應用層沒有引用它似乎很奇怪。

或者,您可以將這些異常保留在應用程序層本身中,前提是這些異常僅由該層使用,也可能由UI層使用。

+0

基礎設施參考應用。應用程序不參考基礎設施。我認爲這是正確的... –

0

這很可能與您的previous question有關。例外情況是應用層定義的合同的一部分,由基礎設施實施(DIPOnion architecture)。它們應該按照應用條款進行定義並按應用程序進行處理,但應從基礎架構中拋出。例如,在應用程序代碼:

public class NotificationException : Exception {...} 

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

而且在基礎設施:

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

你的情況是非常不同的我的情況...請參閱更新... –

0

Acaz索薩 - 你在說應用層不應該參考的基礎設施層不正確。我建議您閱讀InfoQ免費提供的「Domain Driven Design Quick」。

看下面的圖表,這說明了我的觀點。

感謝

Domain Driven Design - Layers

+0

嘿羅尼,這個圖不是領域驅動的設計,據我所知,它是基礎設施驅動。 。域對象(項目)不應該依賴DDD中的基礎設施。 使用ORM來生成** POCO類和實體不需要基礎架構(數據訪問層)上的項目依賴關係,它是一個前置處理,建設前關切.. –

+0

就應用程序對基礎架構的依賴關係而言......基礎架構似乎包含了除了域和應用程序服務的實現以及對sql服務器,網關等的訪問之外的擔憂。也就是說,'System.Net.HttpContext'不是** My **基礎結構層的一部分,但它肯定是我的應用程序層依賴的。所以我只能假設這個圖表將.NET框架程序集指定爲基礎結構層的一部分。但這不是在您的域中實施任何內容的基礎架構..因此它是可疑的。 –

+0

在「域驅動設計快速」一書中,示例使應用層引用基礎設施層,例如, 「應用程序層是一個薄層,位於用戶界面,域和基礎架構之間,它在登錄操作期間與數據庫基礎架構交互......」(第39頁) – Ronnie