(Якщо ви не любите читати, внизу є підсумок :-)
Я теж боровся з точним визначенням служб додатків. Хоча відповідь Віджая була дуже корисною для мого мисленнєвого процесу місяць тому, я не погодився з частиною цього.
Інші ресурси
Інформації про послуги додатків дуже мало. Теми, такі як сукупні корені, сховища та сервіси домену, обговорюються широко, але служби прикладних програм згадуються лише коротко або взагалі залишаються поза ними.
Стаття журналу MSDN Вступ до дизайну, керованого доменом описує прикладні послуги як спосіб перетворення та / або піддавання вашої доменної моделі зовнішнім клієнтам, наприклад, як послуга WCF. Ось як описує Vijay і сервіси прикладних програм. З цієї точки зору, сервіси додатків - це інтерфейс до вашого домену .
Статті Джефрі Палермо про архітектуру цибулі (частина перша , дві та три ) - це добре прочитане. Він розглядає послуги додатків як концепції на рівні додатків , наприклад, сеанс користувача. Хоча це ближче до мого розуміння прикладних служб, воно все ще не відповідає моїм думкам з цього приводу.
Мої думки
Я прийшов розглядати прикладні послуги як залежності, що надаються додатком . У цьому випадку програма може бути додатком для настільних ПК або послугою WCF.
Домен
Час для прикладу. Ви починаєте зі свого домену. Тут реалізовані всі об'єкти та будь-які доменні служби, які не залежать від зовнішніх ресурсів. Будь-які концепції домену, які залежать від зовнішніх ресурсів, визначаються інтерфейсом. Ось можливий макет рішення (назва проекту жирним шрифтом):
Моє рішення
- My.Product.Core (My.Product.dll)
- Доменні сервіси
IExchangeRateService
Товар
ProductFactory
IProductRepository
Product
І ProductFactory
класи були реалізовані в базовій збірці. Це IProductRepository
те, що, ймовірно, підтримується базою даних. Реалізація цього не стосується домену, тому визначається інтерфейсом.
Поки що ми зупинимося на IExchangeRateService
. Логіка бізнесу для цієї послуги реалізується зовнішньою веб-службою. Однак його концепція все ще є частиною домену і представлена цим інтерфейсом.
Інфраструктура
Реалізація зовнішніх залежностей є частиною інфраструктури програми:
Моє рішення
+ My.Product.Core (My.Product.dll)
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- Доменні сервіси
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)
- Доменні сервіси
IExchangeRateService
Товар
ProductFactory
IProductRepository
- My.Product.Infrastructure (My.Product.Infrastructure.dll)
- Прикладні сервіси
ICache
- Доменні сервіси
CachingExchangeRateService
XEExchangeRateService
SqlServerProductRepository
- My.Product.WcfService (My.Product.WcfService.dll)
- Прикладні сервіси
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-визначенням служб, вона не відокремлює домен від програми та дозволяє поділити домен (та інфраструктуру) складання між кількома програмами.