(Nếu bạn không thích đọc, có một bản tóm tắt ở phía dưới :-)
Tôi cũng đã đấu tranh với định nghĩa chính xác của các dịch vụ ứng dụng. Mặc dù câu trả lời của Vijay rất hữu ích cho quá trình suy nghĩ của tôi một tháng trước, tôi đã không đồng ý với một phần của nó.
Các nguồn lực khác
Có rất ít thông tin về các dịch vụ ứng dụng. Các chủ đề như gốc tổng hợp, kho lưu trữ và dịch vụ miền được thảo luận rộng rãi, nhưng các dịch vụ ứng dụng chỉ được đề cập ngắn gọn hoặc bỏ qua hoàn toàn.
Bài viết của Tạp chí MSDN Giới thiệu về Thiết kế hướng tên miền mô tả các dịch vụ ứng dụng như một cách để chuyển đổi và / hoặc hiển thị mô hình miền của bạn cho các máy khách bên ngoài, ví dụ như dịch vụ WCF. Đây là cách Vijay mô tả các dịch vụ ứng dụng quá. Từ quan điểm này, các dịch vụ ứng dụng là một giao diện cho miền của bạn .
Các bài viết của Jeffrey Palermo về Kiến trúc hành tây (phần một , hai và ba ) là một bài đọc tốt. Anh coi các dịch vụ ứng dụng là các khái niệm cấp ứng dụng , như phiên của người dùng. Mặc dù điều này gần với sự hiểu biết của tôi về các dịch vụ ứng dụng, nhưng nó vẫn không phù hợp với suy nghĩ của tôi về chủ đề này.
Suy nghĩ của tôi
Tôi đã nghĩ về các dịch vụ ứng dụng như các phụ thuộc được cung cấp bởi ứng dụng . Trong trường hợp này, ứng dụng có thể là ứng dụng máy tính để bàn hoặc dịch vụ WCF.
Miền
Thời gian cho một ví dụ. Bạn bắt đầu với tên miền của bạn. Tất cả các thực thể và bất kỳ dịch vụ miền nào không phụ thuộc vào tài nguyên bên ngoài đều được triển khai tại đây. Bất kỳ khái niệm miền phụ thuộc vào tài nguyên bên ngoài được xác định bởi một giao diện. Đây là một bố trí giải pháp có thể (tên dự án in đậm):
Giải pháp của tôi
- My. Productt.Core (My. SẢNt.dll)
- Dịch vụ tên miền
Dịch vụ IExchangeRateSate
Sản phẩm
Sản phẩm đạt yêu cầu
IP sinh sản
Các lớp Product
và ProductFactory
đã được thực hiện trong hội đồng cốt lõi. Đây IProductRepository
là một cái gì đó có thể được hỗ trợ bởi một cơ sở dữ liệu. Việc thực hiện điều này không phải là mối quan tâm của miền và do đó được xác định bởi một giao diện.
Hiện tại, chúng tôi sẽ tập trung vào IExchangeRateService
. Logic nghiệp vụ cho dịch vụ này được triển khai bởi một dịch vụ web bên ngoài. Tuy nhiên, khái niệm của nó vẫn là một phần của miền và được thể hiện bằng giao diện này.
Cơ sở hạ tầng
Việc thực hiện các phụ thuộc bên ngoài là một phần của cơ sở hạ tầng của ứng dụng:
Giải pháp của tôi
+ My. Productt.Core (My. SẢNt.dll)
- My.Sản phẩm. Cơ sở hạ tầng (My. Sản phẩm. Cơ sở hạ tầng.dll)
- Dịch vụ tên miền
XEExchangeRateService
SqlServerSản phẩm
XEExchangeRateService
triển khai IExchangeRateService
dịch vụ tên miền bằng cách liên lạc với xe.com . Việc triển khai này có thể được sử dụng bởi các ứng dụng sử dụng mô hình miền của bạn, bằng cách bao gồm cả cơ sở hạ tầng.
Ứng dụng
Lưu ý rằng tôi chưa đề cập đến các dịch vụ ứng dụng. Bây giờ chúng ta sẽ xem xét chúng. Giả sử chúng tôi muốn cung cấp một IExchangeRateService
triển khai sử dụng bộ đệm để tra cứu nhanh. Các phác thảo của lớp trang trí này có thể trông như thế này.
public class CachingExchangeRateService : IExchangeRateService
{
private IExchangeRateService service;
private ICache cache;
public CachingExchangeRateService(IExchangeRateService service, ICache cache)
{
this.service = service;
this.cache = cache;
}
// Implementation that utilizes the provided service and cache.
}
Chú ý ICache
tham số? Khái niệm này không phải là một phần của miền của chúng tôi, vì vậy nó không phải là một dịch vụ tên miền. Đây là một dịch vụ ứng dụng . Đó là một sự phụ thuộc của cơ sở hạ tầng của chúng tôi có thể được cung cấp bởi ứng dụng. Hãy giới thiệu một ứng dụng thể hiện điều này:
Giải pháp của tôi
- My. Productt.Core (My. SẢNt.dll)
- Dịch vụ tên miền
Dịch vụ IExchangeRateSate
Sản phẩm
Sản phẩm đạt yêu cầu
IP sinh sản
- My.Sản phẩm. Cơ sở hạ tầng (My. Sản phẩm. Cơ sở hạ tầng.dll)
- Dịch vụ ứng dụng
ICache
- Dịch vụ tên miền
Bộ nhớ đệmExchangeRateService
XEExchangeRateService
SqlServerSản phẩm
- My. SẢNt.WcfService (My. SẢNt.WcfService.dll)
- Dịch vụ ứng dụng
MemcachedCache
IMyWcfService.cs
+ MyWcfService.svc
+ Web.config
Tất cả điều này kết hợp với nhau trong ứng dụng như thế này:
// Set up all the dependencies and register them in the IoC container.
var service = new XEExchangeRateService();
var cache = new MemcachedCache();
var cachingService = new CachingExchangeRateService(service, cache);
ServiceLocator.For<IExchangeRateService>().Use(cachingService);
Tóm lược
Một ứng dụng hoàn chỉnh bao gồm ba lớp chính:
- miền
- cơ sở hạ tầng
- ứng dụng
Lớp miền chứa các thực thể miền và các dịch vụ miền độc lập. Bất kỳ khái niệm miền (điều này bao gồm các dịch vụ miền, nhưng cũng có kho lưu trữ) phụ thuộc vào tài nguyên bên ngoài, được xác định bởi các giao diện.
Lớp cơ sở hạ tầng chứa việc thực hiện các giao diện từ lớp miền. Những triển khai này có thể giới thiệu các phụ thuộc không thuộc miền mới phải được cung cấp cho ứng dụng. Đây là các dịch vụ ứng dụng và được đại diện bởi các giao diện.
Lớp ứng dụng chứa việc thực hiện các dịch vụ ứng dụng. Lớp ứng dụng cũng có thể chứa các triển khai bổ sung của giao diện miền, nếu các triển khai được cung cấp bởi lớp cơ sở hạ tầng là không đủ.
Mặc dù phối cảnh này có thể không phù hợp với định nghĩa chung về dịch vụ DDD, nhưng nó tách biệt miền khỏi ứng dụng và cho phép bạn chia sẻ lắp ráp miền (và cơ sở hạ tầng) giữa một số ứng dụng.