Application Services
A Plataforma Elevation usa o design pattern Application Service vastamente na definição da API dos componentes runtime da Plataforma.
Na realidade, o padrão é utilizado em praticamente todos os componentes da Core (por exemplo: Notifications Service) mas também na API de integração entre os módulos de uma aplicação Elevation.
A principal vantagem desta abordagem está, para além da definição clara da API de cada componente, na separação entre o contrato da API e a sua implementação concreta (que pode estar inclusivé num módulo diferente).
A abordagem seguida na plataforma para o padrão é representada pelo seguinte diagrama.

É possível que exista mais do que implementação para determinado application service, dependendo da forma como o seu registo automático é definido (nos atributos).
Contrato
O contrato do application service é definido por um interface anotado com o atributo [ApplicationService].
Exemplo:
using System;
using System.Collections.Generic;
using Primavera.Core.ApplicationModel;
namespace Primavera.Core.ApplicationServices
{
/// <summary>
/// Application service to manage currencies.
/// </summary>
[ApplicationService]
public interface ICurrenciesService
{
#region Properties
/// <summary>
/// Gets the list of all the currencies.
/// </summary>
IList<CurrencyData> Currencies
{
get;
}
/// <summary>
/// Gets the exchange rates.
/// </summary>
/// <value>The exchange rates.</value>
IList<CurrencyExchangeRateData> ExchangeRates
{
get;
}
/// <summary>
/// Resets currencies.
/// </summary>
void Reset();
#endregion
#region Methods
/// <summary>
/// Gets the exchange rate between two currencies.
/// </summary>
/// <param name="fromCurrencyId">The source currency id.</param>
/// <param name="toCurrencyId">The target currency id.</param>
/// <param name="date">The exchange rate date.</param>
/// <returns>
/// A service operation instance that can be used to manage the asynchronous request.
/// </returns>
decimal? GetExchangeRate(Guid fromCurrencyId, Guid toCurrencyId, DateTime? date);
#endregion
}
}
É este tipo que deve ser referenciado pelos consumidores do application service, sendo a instância concreta da implementação
resolvida em runtime pela ObjectFactory através do seguinte método.
ICurrenciesService service = ApplicationService.Resolve<ICurrenciesService>();
Implementação
A implementação concreta do application service é definida por uma classe interna com qualquer nome e que tipicamente estará noutra assembly (protegida de referências).
Exemplo:
namespace Primavera.Core.Patterns.Domain
{
/// <summary>
/// Default implementation for the <see cref="ICurrenciesService"/> application service.
/// </summary>
[ApplicationServiceImplementation(typeof(ICurrenciesService))]
internal class DefaultCurrenciesService : ICurrenciesService
{
(...)
}
}