Advertencia |
---|
Las normas expuestas son de obligado cumplimiento. La STIC podrá estudiar los casos excepcionales los cuales serán gestionados a través de los responsables del proyecto correspondiente y autorizados por el Área de Gobernanza de la STIC. Asimismo cualquier aspecto no recogido en estas normas deberá regirse en primera instancia por las guías técnicas correspondientes al esquema nacional de seguridad y esquema nacional de interoperabilidad según correspondencia y en su defecto a los marcos normativos y de desarrollo software establecidos por la Junta de Andalucía, debiendo ser puesto de manifiesto ante la STIC. La STIC se reserva el derecho a la modificación de la norma sin previo aviso, tras lo cual, notificará del cambio a los actores implicados para su adopción inmediata según la planificación de cada proyecto. En el caso de que algún actor considere conveniente y/o necesario el incumplimiento de alguna de las normas y/o recomendaciones, deberá aportar previamente la correspondiente justificación fehaciente documentada de la solución alternativa propuesta, así como toda aquella documentación que le sea requerida por la STIC para proceder a su validación técnica. Contacto Arquitectura: l-arquitectura.stic@juntadeandalucia.es |
Este documento es una guia de desarrollo en continua evolución. Para cualquier duda o sugerencia por favor contante con nosotros. Contacto Arquitectura: l-arquitectura.stic@juntadeandalucia.es |
Expandir |
---|
Histórico de cambios
Expandir | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Proyecto SAS.BduApiClient.Core
Proyecto BduApiClient api/boundary BduDecreeRequestService: Mecanismos de obtención de información de bdu referente a una solicitud decreto de un usuario. Implementa la interfaz IBduDecreeRequestService Proyecto SAS.BduApiClient.ManagedDataAccess.Oracle
Versión 1.2.0 Upgrade Fecha publicación 08-06-2020 Fecha entrada en vigor 08-06-2020 Alcance
Versión 1.1.0 Upgrade Fecha publicación 07-04-2020 Fecha entrada en vigor 07-04-2020 Alcance
Proyecto BduApiClient
Proyecto SAS.BduApiClient.ManagedDataAccess.Oracle Boundary ConfigContextApiBduConnection. Configuración de conexiones a la réplica de BBDD de BDU ManagedConfigBduConnection. Entidad de conexión a contexto MutualidadRepository. Mecanismos de obtención de información referente a mutuas vía réplica de BBDD UserRepository. Mecanismos de obtención de información referente a los usuarios vía réplica de BBDD Control/Mapper
Entity
Entity/EntityFramework/Bdu
Entity/EntityFramework/Exception
Entity/EntityFramework/Projection
Versión 1.0.3 Deps Update Fecha publicación 19-02-2020 Fecha entrada en vigor 19-02-2020 Alcance Actualizada la versión del componente MacoApiClient a la v2.4.1, y la versión de oracle a la v19.6 Versión 1.0.2 Bug fix Fecha publicación 31-07-2019 Fecha entrada en vigor 31-07-2019 Alcance
Versión 1.0.1 Bug fix Fecha publicación 23-04-2019 Fecha entrada en vigor 23-04-2019 Alcance Se actualiza la versión del componente SASUtils.Xml por la v1.0.1, debido a un error en el método obtener texto del nodo XML Versión 1.0.0 Versión inicial .NET Standard 2.0. Fecha publicación 12-03-2019 Fecha entrada en vigor 12-03-2019 Alcance
|
En el presente documento se presenta la librería SAS.BduApiClient, componente .NET Standar 2.0, para el acceso a datos de BDU.
Esta librería permite el acceso a los datos de BDU utilizando dos implementaciones diferentes: una que utiliza internamente el servicio web de BDU y otra que utiliza réplica de BBDD.
Acceder a nuget e instalar la librería SAS.BduApiClient.
|
En el presente documento se presenta la librería SAS.BduApiClient, componente .NET Standar 2.0, para el acceso a datos de BDU.
Esta librería permite el acceso a los datos de BDU utilizando dos implementaciones diferentes: una que utiliza internamente el servicio web de BDU y otra que utiliza réplica de BBDD.
La versión actual de la librería , en su versión acceso a réplica de BBDD, solo dispone de métodos para acceso a la información de mutuas, decretos y los datos principales de usuarios de BDU.
Se recomienda la instalación de la versión de la librería .NET Standard 2.0, en su versión Servicio Web, compatible con .NET Framework desde la versión 4.6.1 de .NET Framework.
Nombre del componente | Versión | Descripción |
---|---|---|
System.ServiceModel.Duplex | 4.5.3 | Proporciona clases para consumir y comunicarse con servicios Dúplex |
System.ServiceModel.Http | 4.5.3 | Gestiona solicitudes realizadas a través del protocolo HTTP |
System.ServiceModel.NetTcp | 4.5.3 | Genera de forma predeterminada una pila de comunicación en tiempo de ejecución, que utiliza la seguridad de transporte, TCP para la entrega de mensajes |
System.ServiceModel.Security | 4.5.3 | Se encarga de temas generales relacionados con la seguridad |
SAS.Common.Core | 1.1.0 | Componente .NET común con clases e interfaces core de aplicaciones |
SAS.Common.Kernel | 1.1.0 | Componente .NET kernel de aplicaciones, como interfaz mapper o diversas utilidades linq |
SAS.MacoApiClient | 2.5.0 | Componente core de MacoApiClient |
SAS.MacoApiClient.WebServices | 2.5.0 | Componente MacoApiClient para el acceso a datos de Maco utilizando los servicios web de Maco |
SAS.MacoApiClient.Exceptions | 2.5.0 | Componente MacoApiClient para el control de excepciones |
SASUtils.Parse | 1.0.0 | Componente utilidad para la conversión entre tipos |
SASUtils.Xml | 1.0.1 | Componente .NET común para el tratamiento de XMLs |
SAS.Common.OracleProvider | 1.3.3 | Componente .NET común para la configuración del proveedor de BBDD Oracle |
EntityFramework | 6.2.0 | ORM de Microsoft para .NET |
Oracle.ManagedDataAccess | 19.6.0 | Proveedor de acceso a datos de Oracle para .NET |
Oracle.ManagedDataAccess.EntityFramework | 19.6.0 | ORM de Oracle para .NET |
Configurar en Visual Studio un nuevo origen de paquetes Nuget ( clic en “Administrar Paquetes Nuget …” del proyecto al que se desea añadir la referencia el componente BduApiClient) indicando en el campo Origen la dirección de repositorios de componentes .NET del SAS: http://net.lib.repository.alm.sas.junta-andalucia.es/.
Versión API < 1.4.0
Versión API >= 1.4.0
Previo a la configuración de la librería se debe de disponer de los siguientes datos proporcionados por la Oficina Técnica de Interoperabilidad:
La configuración de la API depende del tipo de implementación de servicios que se vaya a utilizar, según se acceda a los datos mediante el Servicio Web de BDU o mediante réplicas de BBDD. Veamos cada una de ellas:
En ambos ejemplos se utiliza como base un proyecto .NET MVC.
Primero, en el fichero Startup.cs, método ConfigureServices, se inicializa el contenedor de inyección de dependencia:
Bloque de código | ||||
---|---|---|---|---|
| ||||
public void ConfigureServices(IServiceCollection services)
{
...
ContainerDI.SetAsyncScopedLifestyle(); // establecer estilo de vida por defecto del contenedor de inyección. Permite procesar tanto operaciones asíncronas como síncronas
ContainerDI.RegisterServices(ref services);
...
}
|
ContainerDI, clase del componente común SAS.Util.Injection, el cual permite el registro por inyección de dependencia de los diferentes servicios y tipos utilizados en el sistema.
Configuración de la API para acceder al Servicio Web de BDU
En el fichero appsettings.json se define una sección en la que se establece el código del módulo en MACO y en otra sección, el endpoint del servicio web de BDU.
Bloque de código | ||||
---|---|---|---|---|
| ||||
"MacoApiClient": {
"MacoModule": "XXX" // el código concreto hay que solicitarlo a la OTI
},
"WebServiceLocator": {
"ServiceAddressBdu": "https://servicios.pre.sas.junta-andalucia.es/",
"EndPointAddressBduSolicitud": "/usuario/wsBDU.ashx"
}
|
En el fichero Startup.cs, método Configure(IApplicationBuilder app, IHostingEnvironment env), añadir la siguiente configuración de los controladores , viewcomponents de MVC y la llamada al nuevo método InitializeContainer:
Bloque de código | ||||
---|---|---|---|---|
| ||||
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
ContainerDI.RegisterMvcControllers(ref app);
ContainerDI.RegisterMvcViewComponents(ref app);
this.InitializeContainer();
...
}
|
A continuación, en el fichero Startup.cs, crear el método void InitializeContainer() y añadir la siguiente configuración para registrar por inyección de dependencia los diferentes servicios utilizados de la API:
|
---|
Bloque de código | ||
---|---|---|
| ||
services.AddBduWSServices(bduApiConfig ); |
Se le pasan como argumentos el objeto configuración de la API. Este método se encuentra en el espacio de nombre SAS.BduApiClient.WebService.IoC.
Configuración del servicio de búsqueda de BDU que utiliza internamente el servicio web de BDU
Bloque de código | ||||
---|---|---|---|---|
| ||||
private void InitializeContainer()
{
#region Registrar BDU
ContainerDI.Register<IBduSearch<MacoUser>, BduSearch>(ContainerDI.LifeStyleContainer.Transient);
|
Configuración de la API de BDU, indicando url principal de BDU y código de la aplicación en MACO
Bloque de código | ||||
---|---|---|---|---|
| ||||
var bduApiConfig = new BduApiConfig(Configuration.GetSection("WebServiceLocator:ServiceAddressBdu").Value, Configuration.GetSection("MacoApiClient:MacoModule").Value){}; |
Configuración el endpoint del Servicio web de BDU
Bloque de código | ||||
---|---|---|---|---|
| ||||
bduApiConfig.EndPoints = new Dictionary<BduApiClient.WebService.Api.Entity.EndPointType, string>
{
{ SAS.BduApiClient.WebService.Api.Entity.EndPointType.Solicitud, Configuration.GetSection("WebServiceLocator:EndPointAddressBduSolicitud").Value }
}; |
|
---|
Registro del tipo BDUApiConfig que implementa la interfaz de configuración de BDU, IBduApiConfig
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IBduApiConfig>(() => bduApiConfig, ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo WSBduUserTransformer, que implementa la interfaz IBduUserTransformer. Realiza la transformación de los mensajes XML recibidos del servicio web de BDU a objetos.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IBduUserTransformer , WSBduUserTransformer >(ContainerDI.LifeStyleContainer.Transient); |
|
---|
Registro del tipo BduExceptionManager, que implementa la interfaz IBduExceptionManager. Se encarga de gestionar las excepciones y errores informados del servicio web de BDU.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IBduExceptionManager, BduExceptionManager>(ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo WsBduManager, que implementa la interfaz IWsBduManager. Es la clase wrapper encargada de llamar a los servicios web de BDU.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IWsBduManager, WsBduManager>(ContainerDI.LifeStyleContainer.Transient);
} |
Registro del servicio IConfigContextApiConnection, configuración del contexto de BBDD con el tipo concreto ConfigContextApiBduConnection. Recibe como parámetros la cadena de conexión de la réplica, en este caso del fichero de configuración app.config, tipo de esquema BDU y nombre del esquema de la BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
private void InitializeContainer()
{
...
#region Registrar BDU
// Conexion a la réplica de BDU
var configContextApiBduConnection = new ConfigContextApiBduConnection(new ManagedConfigConnectionBase<SchemaType>[]
{
new ManagedConfigConnectionBase<SchemaType>(ConfigurationManager.ConnectionStrings["BDUConnection"].ConnectionString, SchemaType.Bdu, "NOMBRE DEL ESQUEMA")
});
ContainerDI.Register<IConfigContextApiConnection<SchemaType>>(() => configContextApiBduConnection , ContainerDI.LifeStyleContainer.Transient);
|
Registro del servicio BduUserService, que implemeneta la interfaz IBduSearch. Permite el acceso a datos de usuario vía réplica de BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IBduSearch<object>, BduUserService>(ContainerDI.LifeStyleContainer.Transient); |
Registro del servicio MutualInsuranceService, que implementa la interfaz IMutualInsuranceService, para el acceso a datos de mutuas vía réplica de BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMutualInsuranceService<object>, MutualInsuranceService>(ContainerDI.LifeStyleContainer.Transient); |
Registro del servicio BduDecreeRequestService, que implemeneta la interfaz IBduDecreeRequestService, para el acceso a datos de decretos vía réplica de BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IBduDecreeRequestService<object>, BduDecreeRequestService>(ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo UserRepository que implementa la interfaz IUserRepository. Repositorio encargado de acceder a datos de usuario vía réplica de BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IUserRepository, UserRepository>(ContainerDI.LifeStyleContainer.Transient); |
Registro del tipo MutualidadRepository que implementa la interfaz IMutualidadRepository. Repositorio encargado de acceder a datos de mutualidad vía réplica de BBDD.
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IMutualidadRepository, MutualidadRepository>(ContainerDI.LifeStyleContainer.Transient);
#endregion
...
} |
|
---|
Bloque de código |
---|
services.AddBduOracleServices(configContextApiBduConnection ); |
Se le pasa como argumento la configuración del contexto de BDU. Este método se encuentra en el espacio de nombre SAS.BduApiClient.ManagedDataAccess.Oracle.IoC.
A continuación se presenta el código completo del ejemplo de configuración :
Bloque de código | ||||||
---|---|---|---|---|---|---|
| ||||||
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
...
ContainerDI.SetAsyncScopedLifestyle();
ContainerDI.RegisterServices(ref services);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
ContainerDI.RegisterMvcControllers(ref app);
ContainerDI.RegisterMvcViewComponents(ref app);
app.UseDeveloperExceptionPage();
this.InitializeContainer();
...
}
/// <summary>
/// Inicializador de contenedor utilizando el inyector de dependencia ContainerDI.
/// </summary>
private void InitializeContainer()
{
...
#region registrar BDU
ContainerDI.Register<IUserService, UserService>(ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IBduUseCase, BduUseCase>(ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IBduSearch<MacoUser>, BduSearch>(ContainerDI.LifeStyleContainer.Transient);
var bduApiConfig = new BduApiConfig(Configuration.GetSection("WebServiceLocator:ServiceAddressBdu").Value, Configuration.GetSection("MacoApiClient:MacoModule").Value)
{
};
bduApiConfig.EndPoints = new Dictionary<BduApiClient.WebService.Api.Entity.EndPointType, string>
{
{ SAS.BduApiClient.WebService.Api.Entity.EndPointType.Solicitud, Configuration.GetSection("WebServiceLocator:EndPointAddressBduSolicitud").Value }
};
ContainerDI.Register<IBduApiConfig>(() => bduApiConfig, ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IBduUserTransformer, WSBduUserTransformer>(ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IBduExceptionManager, BduExceptionManager>(ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IBduService, BduService>(ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IWsBduManager, WsBduManager>(ContainerDI.LifeStyleContainer.Transient);
ContainerDI.Register<IBduFactory>(() => new BduFactory(bduApiConfig), ContainerDI.LifeStyleContainer.Transient);
//descomentar en caso de consultar datos de mutuas vía réplica de BBDD
//var configContextApiBduConnection = new ConfigContextApiBduConnection(new ManagedConfigConnectionBase<SchemaType>[]
//{
//new ManagedConfigConnectionBase<SchemaType>(ConfigurationManager.ConnectionStrings["BDUConnection"].ConnectionString, SchemaType.Bdu, "NOMBRE DEL ESQUEMA")
//});
//ContainerDI.Register<IConfigContextApiConnection<SchemaType>>(() => configContextApiBduConnection , ContainerDI.LifeStyleContainer.Transient);
//ContainerDI.Register<IBduSearch<object>, BduUserService>(ContainerDI.LifeStyleContainer.Transient);
//ContainerDI.Register<IMutualInsuranceService<object>, MutualInsuranceService>(ContainerDI.LifeStyleContainer.Transient);
//ContainerDI.Register<IBduDecreeRequestService<object>, BduDecreeRequestService>(ContainerDI.LifeStyleContainer.Transient);
//ContainerDI.Register<IUserRepository, UserRepository>(ContainerDI.LifeStyleContainer.Transient);
//ContainerDI.Register<IMutualidadRepository, MutualidadRepository>(ContainerDI.LifeStyleContainer.Transient);
#endregion registrar BDU
}
} |
Bloque de código | ||||||
---|---|---|---|---|---|---|
| ||||||
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
...
#region configuración BDU
var bduApiConfig = new BduApiConfig(Configuration.GetSection("WebServiceLocator:ServiceAddressBdu").Value, Configuration.GetSection("MacoApiClient:MacoModule").Value)
{
};
bduApiConfig.EndPoints = new Dictionary<BduApiClient.WebService.Api.Entity.EndPointType, string>
{
{ SAS.BduApiClient.WebService.Api.Entity.EndPointType.Solicitud, Configuration.GetSection("WebServiceLocator:EndPointAddressBduSolicitud").Value }
};
services.AddBduWSServices(bduApiConfig);
//descomentar en caso de consultar datos de mutuas vía réplica de BBDD
//var configContextApiBduConnection = new ConfigContextApiBduConnection(new ManagedConfigConnectionBase<SchemaType>[]
//{
//new ManagedConfigConnectionBase<SchemaType>(ConfigurationManager.ConnectionStrings["BDUConnection"].ConnectionString, SchemaType.Bdu, "NOMBRE DEL ESQUEMA")
//});
//services.AddBduOracleServices( configContextApiBduConnection );
#endregion
}
}
|
El objeto QuerysBduUserSearchDto, es la representación de los criterios de búsqueda que son soportados por la API client. Dicho objeto permite los siguientes valores:
Antes de realizar la búsqueda de usuarios vía réplica de BBDD, se valida que el objeto criterio de búsqueda QuerysBduUserSearchDto cumpla las siguientes condiciones:
Los métodos de servicio que la API proporciona son los siguientes:
|
---|
A continuación se describe el uso de la librería.
Funcionalidades utilizando Servicio Web de BDU
Una vez realizada la configuración de la API, se siguen los siguientes pasos para realizar una búsqueda de usuarios utilizando el servicio Web de BDU.
En la clase donde se va a añadir esta funcional, BduService en el ejemplo, añadir al constructor un objeto de tipo IBduSearch: IBduSearch<MacoUser> bduSearch.
Bloque de código | ||||
---|---|---|---|---|
| ||||
...
public class BduService: IBduService
{
private IBduSearch<MacoUser> _bduSearch;
public BduService(IBduSearch<MacoUser> bduSearch)
{
_bduSearch = bduSearch;
}
...
} |
Añadir un método, FindUsers en el ejemplo, con los siguientes parámetros: IGenericAuthContext<MacoUser> petitionerUser y QuerysBduUserSearchDto querysBduUserSearchDto. El primero hace referencia al usuario Maco peticionario de la llamada y el segundo los criterial de la query que se va a realizar.
Llamar al método FindUsers del servicio de BDU, _bduSearch en el ejemplo, pasando como parámetro el usuario peticionario y la query, petitionerUser y queryBduUserSearchDto en el ejemplo.
Por último, se hace el mapping entre el tipo usuario BDU devuelto por la API y el propio del sistema que realiza la llamada.
Bloque de código | ||||
---|---|---|---|---|
| ||||
public List<BduUser> FindUsers(IGenericAuthContext<MacoUser> petitionerUser, QuerysBduUserSearchDto querysBduUserSearchDto)
{
List<BduUser> resultFindUsers = new List<BduUser>();
var result = _bduSearch.FindUsers(petitionerUser, querysBduUserSearchDto);
foreach (SAS.BduApiClient.Api.Entity.BduUser bduUser in result)
{
var bduUserLocal = new BduUser();
bduUserLocal.Name = bduUser.Name;
bduUserLocal.FirstSurname = bduUser.FirstSurname;
bduUserLocal.SecondSurname = bduUser.SecondSurname;
//en un mapping hacer resto de campos
resultFindUsers.Add(bduUserLocal);
}
return resultFindUsers;
} |
El código completo del ejemplo que consulta datos de usuarios vía Réplica de BBDD se muestra a continuación:
Bloque de código | ||||||
---|---|---|---|---|---|---|
| ||||||
using SAS.MacoApiClient.User.Entity;
using SAS.Common.Core.Boundary.Contracts;
using SAS.BduApiClient.Api.Boundary;
using SAS.BduApiClient.Api.Entity.dto;
public class BduService: IBduService
{
private IBduSearch<MacoUser> _bduSearch;
public BduService(IBduSearch<MacoUser> bduSearch)
{
_bduSearch = bduSearch;
}
public List<BduUser> FindUsers(IGenericAuthContext<MacoUser> petitionerUser, QuerysBduUserSearchDto querysBduUserSearchDto)
{
List<BduUser> resultFindUsers = new List<BduUser>();
var result = _bduSearch.FindUsers(petitionerUser, querysBduUserSearchDto);
foreach (SAS.BduApiClient.Api.Entity.BduUser bduUser in result)
{
var bduUserLocal = new BduUser();
bduUserLocal.Name = bduUser.Name;
bduUserLocal.FirstSurname = bduUser.FirstSurname;
bduUserLocal.SecondSurname = bduUser.SecondSurname;
//en un mapping hacer resto de campos
resultFindUsers.Add(bduUserLocal);
}
return resultFindUsers;
}
} |
Crear la interfaz IBduService que implementa la clase BduService:
Bloque de código | ||||
---|---|---|---|---|
| ||||
public interface IBduService
{
List<BduUser> FindUsers(IGenericAuthContext<MacoUser> petitionerUser, QuerysBduUserSearchDto querysBduUserSearchDto);
} |
La clase que se haya creado para añadir la funcionalidad de búsqueda de usuarios se debe registrar en la clase Startup.cs, método InitializeContainer(), al igual que el resto de servicio y tipos. Continuando con el ejemplo:
Bloque de código | ||||
---|---|---|---|---|
| ||||
ContainerDI.Register<IBduService, BduService>(ContainerDI.LifeStyleContainer.Transient); |
o si se declara con el inyector de dependencia por defecto de .NET:
Bloque de código | ||||
---|---|---|---|---|
| ||||
services.AddTransient<IBduService, BduService>(); |
Funcionalidades utilizando la réplica de BDU
En la clase donde vamos a llamar a los diferentes métodos de la API de BDU, BduService en el ejemplo, definimos un objeto interfaz de tipo servicio de mutuas IMutualInsuranceService. Será el objeto utilizado para acceder a los datos de mutuas.
En el método constructor de la clase donde vamos a utilizar la funcionalidad de mutuas, se añade un objeto de tipo IMutualInsuranceService: IMutualInsuranceService<object> servicioMutua;
Bloque de código | ||||
---|---|---|---|---|
| ||||
public class BduService : IBduService
{
/// <summary>
/// Interfaz de servicio al componente de bdu para la mutuas
/// </summary>
private readonly IMutualInsuranceService<object> servicioMutua;
public BduService( IMutualInsuranceService<object> servMutua)
{
this.servicioMutua = servMutua;
} |
A continuación se llama al método GetMutualInsurance del servicio, pasando como parámetro peticionario un null: servicioMutua.GetMutualInsurance(null);, tal y como se observa en el método GetMutuas() del ejemplo:
Bloque de código | ||||
---|---|---|---|---|
| ||||
/// <summary>
/// Método que obtiene todas las mutuas.
/// </summary>
/// <returns>Listado de mutuas aseguradoras.</returns>
public List<MutuaAseguradora> GetMutuas()
{
var mut = this.servicioMutua.GetMutualInsurance(null);
List<MutuaAseguradora> domMut = new List<MutuaAseguradora>();
if (mut != null)
{
foreach (var item in mut)
{
domMut.Add(new MutuaAseguradora(item.Id,item.Description));
}
}
return domMut;
} |
|
---|
En este caso se llamaría al método FindMutualInsurances, que recibe como parámetros el peticionario y el criterio de búsqueda de mutuas, tal y como se observa en el método GetMutuaById del ejemplo::
Bloque de código | ||||
---|---|---|---|---|
| ||||
/// <summary>
/// Método que obtiene una mutua por su codigo de identificacion.
/// </summary>
/// <returns>Codigo y descripcion de la mutua aseguradora.</returns>
public MutuaAseguradora GetMutuaById(decimal? codigo)
{
if (codigo != null)
{
var item= this.servicioMutua.FindMutualInsurances(null, new QuerysMutualInsuranceDto { Id = codigo ?? 0 });
if (item!= null) return new MutuaAseguradora(item.Id,item.Description);
else
return null;
}
else
return null;
} |
Para consultar información de decretos, realizamos los siguientes pasos:
En el constructor de la clase donde vamos a utilizar la funcionalidad de decretos, se añade un objeto de tipo IBduDecreeRequestService: IBduDecreeRequestService<object> servicioDecretos;
Bloque de código | ||||
---|---|---|---|---|
| ||||
public class BduService : IBduService {
/// <summary>
/// Interfaz de servicio al componente de bdu para las mutuas.
/// </summary>
private readonly IBduDecreeRequestService<object> servicioDecretos;
public BduService( IBduDecreeRequestService<object> servicioDecretos)
{
this.servicioMutua = servMutua;
}
...
} |
A continuación se llama al método public BduDecreeRequest FindBduElementsDecreeRequest(IGenericAuthContext<object> petitionerBdu, QuerysBduUserSearchDto criteria), que recibe como parámetros el peticionario y el criterio de búsqueda.
En el atributo peticionario se le pasaría un null y en criteria el criterio de búsqueda QuerysBduUserSearchDto, con el NUHSA relleno. Devuelve un objeto petición de decreto con los siguientes valores de la tabla BDU por NUHSA:
Bloque de código | ||||
---|---|---|---|---|
| ||||
List<BduDecreeRequest> FindDecreeRequest( QuerysBduUserSearchDto querysBduUserSearchDto)
{
var listaBduDecreeRequest = this.servicioDecretos.FindBduElementsDecreeRequest(null, querysBduUserSearchDto);
List<PeticionDecreto> listaPeticionDecreto = new List<PeticionDecreto>();
if (listaBduDecreeRequest != null)
{
foreach (var item in listaBduDecreeRequest)
{
var peticionDecreto = new PeticionDecreto()
{
Nuhsa = item.Nusa,
ClaveMedica= item.Clave_Medica,
EspecialidadCm = item.Especialidad_Cm,
SituacionActual = item.Situacion_Actual,
Validado = item.Validado
};
listaPeticionDecreto.Add( peticionDecreto );
}
}
return listaPeticionDecreto;
} |
El código completo del ejemplo de consulta de datos de mutuas y decretos se muestra a continuación:
Bloque de código | ||||||
---|---|---|---|---|---|---|
| ||||||
public class BduService : IBduService {
/// <summary>
/// Interfaz de servicio al componente de bdu para la mutuas
/// </summary>
private readonly IMutualInsuranceService<object> servicioMutua;
/// <summary>
/// Interfaz de servicio al componente de bdu para las decretos.
/// </summary>
private readonly IBduDecreeRequestService<object> servicioDecretos;
public BduService( IMutualInsuranceService<object> servMutua, IBduDecreeRequestService<object> servicioDecretos)
{
this.servicioMutua = servMutua;
this.servicioDecretos = servicioDecretos;
}
/// <summary> /// Método que obtiene todas las mutuas.
/// </summary> /// <returns>Listado de mutuas aseguradoras.</returns>
public List<MutuaAseguradora> GetMutuas() {
var mut = this.servicioMutua.GetMutualInsurance(null);
List<MutuaAseguradora> domMut = new List<MutuaAseguradora>();
if (mut != null) {
foreach (var item in mut) {
domMut.Add(new MutuaAseguradora(item.Id,item.Description));
}
}
return domMut;
}
/// <summary>
/// Método que obtiene una mutua por su codigo de identificacion.
/// </summary>
/// <returns>Codigo y descripcion de la mutua aseguradora.</returns>
public MutuaAseguradora GetMutuaById(decimal? codigo)
{
if (codigo != null)
{
var item= this.servicioMutua.FindMutualInsurances(null, new QuerysMutualInsuranceDto { Id = codigo ?? 0 });
if (item!= null) return new MutuaAseguradora(item.Id,item.Description);
else
return null;
}
else
return null;
}
List<BduDecreeRequest> FindDecreeRequest( QuerysBduUserSearchDto querysBduUserSearchDto)
{
var listaBduDecreeRequest = this.servicioDecretos.FindBduElementsDecreeRequest(null, querysBduUserSearchDto);
List<PeticionDecreto> listaPeticionDecreto = new List<PeticionDecreto>();
if (listaBduDecreeRequest != null)
{
foreach (var item in listaBduDecreeRequest)
{
var peticionDecreto = new PeticionDecreto()
{
Nuhsa = item.Nusa,
ClaveMedica= item.Clave_Medica,
EspecialidadCm = item.Especialidad_Cm,
SituacionActual = item.Situacion_Actual,
Validado = item.Validado
};
listaPeticionDecreto.Add( peticionDecreto );
}
}
return listaPeticionDecreto;
} |
La siguiente configuración de ejemplo se añadiría en clase Startup de un proyecto ASP .NET MVC.
Primero, en el fichero Startup.cs, método ConfigureServices, inicializamos el contenedor de inyección de dependencia:
public void ConfigureServices(IServiceCollection services)
{
...
ContainerDI.SetAsyncScopedLifestyle(); // establecer estilo de vida por defecto del contenedor de inyección. Permite procesar tanto operaciones asíncronas como síncronas
ContainerDI.RegisterServices(ref services);
...
}
ContainerDI, clase del componente común SAS.Util.Injection, el cual permite el registro por inyección de dependencia de los diferentes servicios y tipos utilizados en el sistema.
(4) var bduApiConfig = new BduApiConfig(Configuration.GetSection("WebServiceLocator:ServiceAddressBdu").Value, Configuration.GetSection("MacoApiClient:MacoModule").Value){
};
(5) bduApiConfig.EndPoints = new Dictionary<BduApiClient.Api.Entity.EndPointType, string>
{
{ SAS.BduApiClient.Api.Entity.EndPointType.Solicitud, Configuration.GetSection("WebServiceLocator:EndPointAddressBduSolicitud").Value }
};
(6) ContainerDI.Register<IBduApiConfig>(() => bduApiConfig, ContainerDI.LifeStyleContainer.Transient);
(7) ContainerDI.Register<IBduUserManager, BduUserManager>(ContainerDI.LifeStyleContainer.Transient);
(8) ContainerDI.Register<IBduExceptionManager, BduExceptionManager>(ContainerDI.LifeStyleContainer.Transient);
(9) ContainerDI.Register<IWsBduManager, WsBduManager>(ContainerDI.LifeStyleContainer.Transient);
#endregion
...
}
(3) Configuración del servicio de búsqueda de BDU que utiliza internamente el servicio web de BDU
(4) Configuración de la API de BDU, indicando url de BDU y código de la aplicación en MACO
(5) Configuración el endpoint del Servicio web de BDU
(6) Registro del tipo BDUApiConfig que implementa la interfaz de configuración de BDU, IBduApiConfig
(7) Registro del tipo BduUserManager, que implementa la interfaz IBduUserManager
(8) Registro del tipo BduExceptionManager, que implementa la interfaz IBduExceptionManager
(9) Registro del tipo WsBdumanager, que implementa la interfaz IWsBduManager
private void InitializeContainer()
{
...
#region Registrar BDU
(10) ContainerDI.Register<IBduSearch<object>, BduUserService>(ContainerDI.LifeStyleContainer.Transient);
(11) ContainerDI.Register<IMutualInsuranceService<object>, MutualInsuranceService>(ContainerDI.LifeStyleContainer.Transient);
(12) ContainerDI.Register<IBduDecreeRequestService<object>, BduDecreeRequestService>(ContainerDI.LifeStyleContainer.Transient);
(13) ContainerDI.Register<IUserRepository, UserRepository>(ContainerDI.LifeStyleContainer.Transient);
(14) ContainerDI.Register<IMutualidadRepository, MutualidadRepository>(ContainerDI.LifeStyleContainer.Transient);
(15) // Conexion a la réplica de BDU
ContainerDI.Register<IConfigContextApiConnection<SchemaType>>(() =>
new ConfigContextApiBduConnection(new ManagedConfigConnectionBase<SchemaType>[]
{
new ManagedConfigConnectionBase<SchemaType>(ConfigurationManager.ConnectionStrings["BDUConnection"].ConnectionString, SchemaType.Bdu, "NOMBRE DEL ESQUEMA")
})
, ContainerDI.LifeStyleContainer.Transient);
#endregion
...
}
(10) Registro del servicio BduUserService, que implemeneta la interfaz IBduSearch. Permite el acceso a datos de usuario vía réplica de BBDD.
(11) Registro del servicio MutualInsuranceService, que implemeneta la interfaz IMutualInsuranceService, para el acceso a datos de mutuas vía réplica.
(12) Registro del servicio BduDecreeRequestService, que implemeneta la interfaz IBduDecreeRequestService, para el acceso a datos de decretos vía réplica.
(13) Registro del tipo UserRepository que implementa la interfaz IUserRepository
(14) Registro del tipo MutualidadRepository que implementa la interfaz IUseIMutualidadRepository
(15) Configuración del contexto de BBDD con el tipo concreto ConfigContextApiBduConnection. Recibe como parámetros la cadena de conexión de la réplica de BDU, tipo de esquema Bdu y nombre del esquema de la BBDD.
El objeto QuerysBduUserSearchDto, es la representación de los criterios de búsqueda que son soportados por la API client. Dicho objeto permite los siguientes valores:
Antes de realizar la búsqueda de usuarios, vía servicio web o réplica de BBDD, se valida que el objeto criterio de búsqueda QuerysBduUserSearchDto cumpla las siguientes condiciones:
Los métodos de servicio que la API proporciona son los siguientes:
Funcionalidades utilizando Servicio Web de BDU
Una vez realizada la configuración de la API, se siguen los siguientes pasos para realizar una búsqueda de usuarios utilizando el servicio Web de BDU.
1. En la clase donde se va a añadir esta funcional, BduService en el ejemplo, añadir al constructor un objeto de tipo IBduSearch: IBduSearch<MacoUser> bduSearch.
2. Añadir un método, FindUsers en el ejemplo, con los siguientes parámetros: IGenericAuthContext<MacoUser> petitionerUser y QuerysBduUserSearchDto querysBduUserSearchDto. El primero hace referencia al usuario Maco peticionario de la llamada y el segundo los criterial de la query que se va a realizar.
3. Llamar al método FindUsers del servicio de BDU, _bduSearch en el ejemplo, pasando como parámetro el usuario peticionario y la query, petitionerUser y queryBduUserSearchDto en el ejemplo.
4. Por último, se hace el mapping entre el tipo usuario BDU devuelto por la API y el propio del sistema que realiza la llamada.
Ejemplo:
...
using SAS.MacoApiClient.User.Entity;
using SAS.Common.Core.Boundary.Contracts;
using SAS.BduApiClient.Core.Entity.dto;
using SAS.BduApiClient.Core.Boundary.Contracts.Services;
...
public class BduService: IBduService
{
private IBduSearch<MacoUser> _bduSearch;
public BduService(IBduSearch<MacoUser> bduSearch)
{
_bduSearch = bduSearch;
}
public List<BduUser> FindUsers(IGenericAuthContext<MacoUser> petitionerUser, QuerysBduUserSearchDto querysBduUserSearchDto)
{
List<BduUser> resultFindUsers = new List<BduUser>();
var result = _bduSearch.FindUsers(petitionerUser, querysBduUserSearchDto);
foreach (SAS.BduApiClient.Core.Entity.BduUser bduUser in result)
{
var bduUserLocal = new BduUser();
bduUserLocal.Name = bduUser.Name;
bduUserLocal.FirstSurname = bduUser.FirstSurname;
bduUserLocal.SecondSurname = bduUser.SecondSurname;
//en unmapping hacer resto de campos
resultFindUsers.Add(bduUserLocal);
}
return resultFindUsers;
}
}
}
5. La clase que se haya creado para añadir la funcionalidad de búsqueda de usuarios se debe registrar en la clase Startup.cs, método InitializeContainer(), al igual que el resto de servicio y tipos. Continuando con el ejemplo:
ContainerDI.Register<IBduService, BduService>(ContainerDI.LifeStyleContainer.Transient);
Funcionalidades utilizando la réplica de BDU
Para consultar información de decretos, realizamos los siguientes pasos: