(ถ้าคุณไม่อยากอ่านมีบทสรุปที่ด้านล่าง :-)
ฉันก็ต้องดิ้นรนกับคำจำกัดความที่แม่นยำของบริการแอปพลิเคชัน แม้ว่าคำตอบของวีเจย์จะเป็นประโยชน์อย่างมากต่อกระบวนการคิดของฉันเมื่อเดือนที่แล้ว แต่ฉันก็ไม่เห็นด้วยกับเรื่องนี้
แหล่งข้อมูลอื่น ๆ
มีข้อมูลน้อยมากเกี่ยวกับบริการแอปพลิเคชัน วิชาเช่นรูทรวมที่เก็บข้อมูลและบริการโดเมนมีการพูดคุยกันอย่างกว้างขวาง แต่บริการแอปพลิเคชันจะกล่าวถึงเพียงสั้น ๆ หรือออกทั้งหมด
บทความในนิตยสาร MSDN คำแนะนำเกี่ยวกับการออกแบบที่ขับเคลื่อนด้วยโดเมนอธิบายบริการแอปพลิเคชันเป็นวิธีการแปลงและ / หรือแสดงแบบจำลองโดเมนของคุณไปยังไคลเอนต์ภายนอกเช่นบริการ WCF นี่คือวิธีที่ Vijay อธิบายบริการแอปพลิเคชันด้วย จากมุมมองนี้บริการแอพลิเคชันเป็นอินเตอร์เฟซโดเมนของคุณ
บทความเจฟฟรีย์ปาแลร์โมในหัวหอมสถาปัตยกรรม (ส่วนหนึ่ง , สองและสาม ) เป็นผู้อ่านที่ดี เขาปฏิบัติต่อบริการแอปพลิเคชันเป็นแนวคิดระดับแอปพลิเคชันเช่นเซสชันของผู้ใช้ แม้ว่าสิ่งนี้จะใกล้เคียงกับความเข้าใจในบริการแอปพลิเคชันของฉันมากขึ้น แต่ก็ยังไม่สอดคล้องกับความคิดของฉันในเรื่องนี้
ความคิดของฉัน
ฉันได้มาคิดว่าการใช้บริการเป็นอ้างอิงให้โดยแอพลิเคชัน ในกรณีนี้แอปพลิเคชันอาจเป็นแอปพลิเคชันเดสก์ท็อปหรือบริการ WCF
โดเมน
เวลาสำหรับตัวอย่าง คุณเริ่มต้นด้วยโดเมนของคุณ เอนทิตีทั้งหมดและบริการโดเมนใด ๆ ที่ไม่ขึ้นอยู่กับทรัพยากรภายนอกจะถูกนำมาใช้ที่นี่ แนวคิดโดเมนใด ๆ ที่ขึ้นอยู่กับทรัพยากรภายนอกจะถูกกำหนดโดยอินเตอร์เฟส นี่คือรูปแบบโซลูชันที่เป็นไปได้ (ชื่อโครงการเป็นตัวหนา):
โซลูชันของฉัน
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
สินค้า
ProductFactory
IProductRepository
Product
และProductFactory
เรียนได้รับการดำเนินการในการชุมนุมหลัก นี่IProductRepository
คือสิ่งที่อาจได้รับการสนับสนุนจากฐานข้อมูล การใช้สิ่งนี้ไม่ใช่ความกังวลของโดเมนและถูกกำหนดโดยอินเทอร์เฟซ
IExchangeRateService
สำหรับตอนนี้เราจะมุ่งเน้นไปที่ ตรรกะทางธุรกิจสำหรับบริการนี้ดำเนินการโดยเว็บเซอร์วิสภายนอก อย่างไรก็ตามแนวคิดของมันยังคงเป็นส่วนหนึ่งของโดเมนและแสดงโดยอินเทอร์เฟซนี้
โครงสร้างพื้นฐาน
การใช้งานการพึ่งพาภายนอกเป็นส่วนหนึ่งของโครงสร้างพื้นฐานของแอปพลิเคชัน:
โซลูชันของฉัน
+ My.Product.Core (My.Product.dll)
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- DomainServices
XEExchangeRateService
SqlServerProductRepository
XEExchangeRateService
ดำเนินการIExchangeRateService
ให้บริการโดเมนโดยการสื่อสารกับxe.com การใช้งานนี้สามารถใช้งานได้โดยแอปพลิเคชันของคุณที่ใช้โมเดลโดเมนของคุณรวมถึงการประกอบโครงสร้างพื้นฐาน
ใบสมัคร
โปรดทราบว่าฉันยังไม่ได้กล่าวถึงบริการแอปพลิเคชัน เราจะดูที่ตอนนี้ สมมติว่าเราต้องการให้มีIExchangeRateService
การใช้งานที่ใช้แคชสำหรับการค้นหาที่รวดเร็ว โครงร่างของคลาสมัณฑนากรนี้อาจมีลักษณะเช่นนี้
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.
}
สังเกตเห็นICache
พารามิเตอร์หรือไม่ แนวคิดนี้ไม่ได้เป็นส่วนหนึ่งของโดเมนของเราดังนั้นจึงไม่ใช่บริการโดเมน มันเป็นบริการแอพลิเคชัน มันขึ้นอยู่กับโครงสร้างพื้นฐานของเราที่แอพพลิเคชั่นอาจมอบให้ มาแนะนำแอปพลิเคชั่นที่สาธิตเรื่องนี้:
โซลูชันของฉัน
- My.Product.Core (My.Product.dll)
- DomainServices
IExchangeRateService
สินค้า
ProductFactory
IProductRepository
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- ApplicationServices
ICache
- DomainServices
CachingExchangeRateService
XEExchangeRateService
SqlServerProductRepository
- My.Product.WcfService (My.Product.WcfService.dll)
- ApplicationServices
MemcachedCache
IMyWcfService.cs
+ MyWcfService.svc
+ Web.config
ทั้งหมดนี้มาพร้อมกันในแอปพลิเคชันเช่นนี้:
// 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);
สรุป
แอปพลิเคชันที่สมบูรณ์ประกอบด้วยสามเลเยอร์ที่สำคัญ:
- โดเมน
- โครงสร้างพื้นฐาน
- ใบสมัคร
เลเยอร์โดเมนมีเอนทิตีโดเมนและบริการโดเมนแบบสแตนด์อะโลน แนวคิดโดเมนใด ๆ(ซึ่งรวมถึงบริการโดเมน แต่ยังเป็นที่เก็บข้อมูล) ที่ขึ้นอยู่กับทรัพยากรภายนอกจะถูกกำหนดโดยอินเตอร์เฟส
เลเยอร์โครงสร้างพื้นฐานประกอบด้วยการใช้งานอินเทอร์เฟซจากโดเมนเลเยอร์ การใช้งานเหล่านี้อาจแนะนำการขึ้นต่อกันที่ไม่ใช่โดเมนใหม่ซึ่งจะต้องมีการจัดเตรียมแอปพลิเคชัน นี่คือแอปพลิเคชันบริการและแสดงโดยอินเทอร์เฟซ
ชั้นแอปพลิเคชันมีการใช้งานบริการแอปพลิเคชัน เลเยอร์แอปพลิเคชันอาจมีการใช้งานเพิ่มเติมของอินเทอร์เฟซโดเมนถ้าการใช้งานที่จัดทำโดยชั้นโครงสร้างพื้นฐานไม่เพียงพอ
แม้ว่ามุมมองนี้อาจไม่ตรงกับข้อกำหนด DDD ทั่วไปของบริการ แต่จะแยกโดเมนออกจากแอปพลิเคชันและอนุญาตให้คุณแชร์แอสเซมบลีโดเมน (และโครงสร้างพื้นฐาน) ระหว่างแอปพลิเคชันต่างๆ