Í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.
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.App disponível em https://www.myget.org/F/tnf/api/v3/index.json
Caso você 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 referências entre eles não sendo necessário instalá-las em cada assembly.
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
[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).Assembly);
}
} |
Como mencionado anteriormente no tópico de introdução a camada de aplicação, essa 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:
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.
Todo serviço de aplicação deve implementar a interface IApplicationService.
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public interface IPersonAppService : IApplicationService
{
PersonDto CreatePerson(PersonDto person);
} |
Ao 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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class PersonAppService : AppApplicationService, IPersonAppService
{
private readonly IPersonService _service;
public TaskAppService(IPersonService service)
{
_service = service;
}
public PersonDto CreatePerson(PersonDto person)
{
ValidateDto<PersonDto, int>(person);
if (Notification.HasNotification())
return PersonDto.NullInstance;
// Write some logs (Logger is defined in AppApplicationService class)
Logger.Info("Creating a new person with name: " + input.Name);
// Get a localized text (L is a shortcut for LocalizationHelper.GetString(...), defined in AppApplicationService class)
var text = L("SampleLocalizableTextKey");
var personBuilder = 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 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.