Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Índice

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.

Criando o projeto

Para começarmos a trabalhar temos que criar um projeto com suporte a .NET Core.

...

Com o projeto criado vamos adicionar os seguintes pacotes via nuget: Tnf, nuget Tnf.Dto disponível em nosso package source: App disponível em 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 referências entre eles não sendo necessário instalainstalá-las em cada assembly.

Definindo um Módulo

...

Bloco de código
languagec#
firstline1
titleAppModule.cs
linenumberstrue
[DependsOn(
	typeof(TnfAutoMapperModule),
	typeof(DomainModule),
	typeof(CarolModule),
	typeof(EntityFrameworkModule))]
public class AppModule : TnfModule
{
	public override void PreInitialize()
	{
		base.PreInitialize();

        //Configurando Log4Net logging
        IocManager.IocContainer.AddFacility<LoggingFacility>(
            f => f.UseTnfLog4Net().WithConfig("log4net.config")
        );
	}
	public override void Initialize()
	{
		IocManager.RegisterAssemblyByConvention(typeof(AppModule).GetAssembly()Assembly);
	}
}

Como mencionado anteriormente no tópico de introdução a camada de aplicação, esse essa camada tem a responsabilidade de ligar nosso assembly de negocio com nossa infraestrutura.

...

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:

  • TnfAutoMapperModule: configura o suporte ao uso do AutoMapper;
  • DomainModule: modulo da camada de domínio;
  • CarolModule: modulo da camada de infraestrutura que

...

  • utiliza Carol (SAS TOTVS);
  • EntityFrameworkModule: modulo da camada de infraestrutura que utiliza Entity Framework Core;

No exemplo acima configuramos o nosso serviço de logger para ser o do Log4Net com o Castle para isso precisa adicionar o pacote de Tnf.App.Castle.Log4Net ao projeto de Application.

Criando um Serviço de Aplicação

...

Todo serviço de aplicação deve implementar a interface IApplicationService.

Bloco de código
languagec#
firstline1
titleDefinição da interface do serviço de aplicação
linenumberstrue
public interface ITaskAppServiceIPersonAppService : IApplicationService
{
    voidPersonDto CreateTaskCreatePerson(CreateTaskInputPersonDto inputperson);
}

Criando o serviço

Agora vamos implementar o contrato de nosso serviço definido acima. Toda implementação de serviços de aplicação devem derivar da classe ApplicationServiceAo fazer a implementação devemos derivar da classe AppApplicationService. 

Essa classe expõe funcionalidades pré-definidas pelo TNF que facilitam o uso de logging e localization por exemplo.

Bloco de código
languagec#
firstline1
titleImplementação do serviço de aplicação
linenumberstrue
public class TaskAppServicePersonAppService : ApplicationServiceAppApplicationService, ITaskAppServiceIPersonAppService
{
    private readonly IPersonService _service;
    public TaskAppService(IPersonService service)
    {
        LocalizationSourceName_service = "SimpleTaskSystem"service;
    }

    public voidPersonDto CreateTaskCreatePerson(CreateTaskInputPersonDto inputperson)
    {
       	ValidateDto<PersonDto, int>(person);
         
		if (Notification.HasNotification())
        	return PersonDto.NullInstance;
        // Write some logs (Logger is defined in ApplicationServiceAppApplicationService class)
        Logger.Info("Creating a new taskperson with descriptionname: " + input.DescriptionName);

        // Get a localized text (L is a shortcut for LocalizationHelper.GetString(...), defined in ApplicationServiceAppApplicationService class)
        var text = L("SampleLocalizableTextKey");



        //var TODO:personBuilder Add new task to database...
    = new PersonBuilder(Notification)
                .WithId(person.Id)
                .WithName(person.Name)
                .WithChildren(person.Children.Select(p => new PersonBuilder(Notification).WithId(p.Id).WithName(p.Name)).ToList());

        person.Id = _service.InsertAndGetId(personBuilder);

        return person;		
    }
}

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ênciamétodo Initialize para o suporte a injeção de dependência.

Em nossa implementação do "TaskAppService" estamos usando a infraestrutura de Logger usada para criação de logs e L que representa o acesso a estrutura de localização do framework.

Essas e outras funcionalidades estão disponíveis através da herança do AppApplicationService.