Neste tópico vamos criar um projeto para nossa camada de aplicação, definir um módulo, interface e implementação de nosso serviço de aplicação.
Para começarmos a trabalhar temos que criar um projeto com suporte a .NET Core.
Para isso através do Visual Studio vamos criar nosso projeto acessando: File -> New -> Project -> .NET Standard -> Class Library.
Com o projeto criado vamos adicionar os seguintes pacotes via nuget: Tnf, Tnf.Dto disponível em nosso package source: https://www.myget.org/F/tnf/api/v3/index.json
Caso você faça referencie outros projetos em sua camada de aplicação como: camada de domínio e de infraestrutura, note que os projetos do .NET Core compartilham referencias entre eles não sendo necessário instala-las em cada assembly.
Vamos agora criar nosso modulo adicionando referências para nossa camada de aplicação.
[DependsOn( typeof(TnfAutoMapperModule), typeof(DomainModule), typeof(CarolModule), typeof(EntityFrameworkModule))] public class AppModule : TnfModule { public override void PreInitialize() { base.PreInitialize(); } public override void Initialize() { IocManager.RegisterAssemblyByConvention(typeof(AppModule).GetAssembly()); } }
Como mencionado anteriormente no tópico de introdução a camada de aplicação, esse camada tem a responsabilidade de ligar nosso assembly de negocio com nossa infraestrutura.
O atributo "DependsOn" informa as dependências de camada de aplicação.
O exemplo a seguir mostra um cenário onde temos como dependências: uma camada de domínio, duas de infraestrutura e uma de cross-cutting:
Todo serviço de aplicação deve implementar a interface IApplicationService.
public interface ITaskAppService : IApplicationService { void CreateTask(CreateTaskInput input); }
Agora vamos implementar o contrato de nosso serviço definido acima. Toda implementação de serviços de aplicação devem derivar da classe ApplicationService.
Essa classe expõe funcionalidades pré-definidas pelo TNF que facilitam o uso de logging e localization por exemplo.
public class TaskAppService : ApplicationService, ITaskAppService { public TaskAppService() { LocalizationSourceName = "SimpleTaskSystem"; } public void CreateTask(CreateTaskInput input) { // Write some logs (Logger is defined in ApplicationService class) Logger.Info("Creating a new task with description: " + input.Description); // Get a localized text (L is a shortcut for LocalizationHelper.GetString(...), defined in ApplicationService class) var text = L("SampleLocalizableTextKey"); // TODO: Add new task to database... } }
Note que nosso módulo registra as convenções no método Initialize. Nosso serviço de aplicação já será automaticamente configurado em nosso container de injeção de dependência.