2011-10-03 34 views
6

Tôi đang xây dựng một ứng dụng với kiến ​​trúc sau:Trong DDD nơi để giữ ngoại lệ tùy chỉnh (ngoại lệ ứng dụng)? Trong tầng cơ sở hạ tầng?

UI - Application - Domain - Cơ sở hạ tầng

Tôi có một lớp ứng dụng mà cần phải sử dụng ngoại lệ tùy chỉnh. Tôi giữ các ngoại lệ tùy chỉnh này ở đâu? Trong tầng cơ sở hạ tầng? Vấn đề là lớp ứng dụng của tôi không có tham chiếu đến tầng cơ sở hạ tầng.

Cách chính xác là gì?

Cập nhật:

Dưới đây là mã của tôi mà ném một ngoại lệ trong Application Layer:

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

Thậm chí ImageSettings là một ConfigurationSection là ở Tầng ứng dụng của tôi, vì nó sử dụng nó. Tôi không thấy cách khác tôi có thể chuyển ImageSettings của tôi (mà nên ở trong tầng cơ sở hạ tầng) để tầng cơ sở hạ tầng, ai đó có thể giúp đỡ?

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

Trả lời

0

Bạn có một lớp mà mối quan tâm xuyên suốt (như khai thác gỗ hoặc dependency injection) đều được giải quyết và được tham chiếu bởi tất cả các dự án khác trong giải pháp của bạn? Nếu vậy, đây là nơi bạn nên đặt những ngoại lệ tùy chỉnh này. Tôi đoán rằng bởi "tầng cơ sở hạ tầng", bạn thực sự có nghĩa là lớp cắt ngang này, nhưng nếu có, có vẻ lạ khi lớp ứng dụng của bạn không tham chiếu đến nó.

Ngoài ra, bạn có thể giữ các ngoại lệ này trong chính lớp ứng dụng, miễn là các ngoại lệ này chỉ được lớp đó sử dụng và có thể do lớp giao diện người dùng cũng vậy.

+0

Ứng dụng tài liệu tham khảo cơ sở hạ tầng. Ứng dụng không tham khảo INfrastructure. Tôi nghĩ rằng đây là chính xác ... –

0

Điều này rất có thể liên quan đến số previous question của bạn. Ngoại lệ là một phần của hợp đồng được xác định bởi lớp ứng dụng và được thực hiện bởi cơ sở hạ tầng (DIPOnion architecture). Chúng phải được định nghĩa trong các điều khoản đăng ký và được xử lý bởi ứng dụng, nhưng được đưa ra từ cơ sở hạ tầng. Ví dụ, trong mã ứng dụng của bạn:

public class NotificationException : Exception {...} 

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

Và trong cơ sở hạ tầng:

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

kịch bản của bạn là rất khác nhau của kịch bản của tôi ... xem cập nhật xin vui lòng ... –

0

Acaz Souza - bạn không chính xác khi nói Application Lớp should not tham khảo các lớp cơ sở hạ tầng. Tôi đề nghị bạn đọc "Domain Driven Design Quickly", có sẵn miễn phí từ InfoQ.

Nhìn vào biểu đồ bên dưới, minh họa quan điểm của tôi.

Cảm ơn

Domain Driven Design - Layers

+0

Hey Ronnie, sơ đồ này không phải là thiết kế điều khiển tên miền như tôi hiểu nó được, nó là cơ sở hạ tầng điều khiển. Các đối tượng miền (dự án) không nên phụ thuộc vào cơ sở hạ tầng trong DDD .. sử dụng ORM để ** Tạo ** Các lớp và thực thể POCO không yêu cầu phụ thuộc dự án vào Cơ sở hạ tầng (Lớp truy cập dữ liệu), nó là tiền -quá trình, mối quan tâm trước khi xây dựng .. –

+0

Theo như sự phụ thuộc của ứng dụng vào cơ sở hạ tầng có liên quan .. cơ sở hạ tầng dường như bao gồm các mối quan tâm vượt ra ngoài việc thực hiện các dịch vụ miền và ứng dụng và truy cập vào máy chủ sql, cổng vào và như vậy .. Đó là 'System.Net.HttpContext' không phải là một phần của ** Lớp cơ sở hạ tầng ** của tôi, nhưng chắc chắn đó là lớp ứng dụng của tôi có sự phụ thuộc vào. Vì vậy, tôi chỉ có thể giả định sơ đồ này là chỉ định các assembly của khung lưới như là một phần của tầng cơ sở hạ tầng. nhưng đó không phải là cơ sở hạ tầng đang triển khai bất kỳ thứ gì trong miền của bạn .. do đó nó không rõ ràng .. –

+0

Trong cuốn sách "Thiết kế theo hướng miền nhanh", các ví dụ có lớp ứng dụng tham chiếu lớp cơ sở hạ tầng, ví dụ: "Lớp ứng dụng là một lớp mỏng đứng giữa giao diện người dùng, tên miền và cơ sở hạ tầng. Nó tương tác với cơ sở hạ tầng cơ sở dữ liệu trong các hoạt động đăng nhập ... vv" (trang 39) – Ronnie

Các vấn đề liên quan