Application Services

A Plataforma Elevation usa o design pattern Application Service vastamente na definição da API dos componentes runtime da Plataforma.

Ver Core Application Services Design Reference.

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.

Framework Athena

É 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
    {
        (...)
    }
}