Contacto Arquitectura: l-arquitectura.stic@juntadeandalucia.es
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:
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.
"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:
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:
|
---|
Configuración del servicio de búsqueda de BDU que utiliza internamente el servicio web de BDU
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
var bduApiConfig = new BduApiConfig(Configuration.GetSection("WebServiceLocator:ServiceAddressBdu").Value, Configuration.GetSection("MacoApiClient:MacoModule").Value){};
Configuración el endpoint del Servicio web de BDU
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
ContainerDI.Register<IMutualidadRepository, MutualidadRepository>(ContainerDI.LifeStyleContainer.Transient); #endregion ... }
|
---|
A continuación se presenta el código completo del ejemplo de configuración :
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.
... 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.
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:
Crear la interfaz IBduService que implementa la clase BduService:
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:
ContainerDI.Register<IBduService, BduService>(ContainerDI.LifeStyleContainer.Transient);
o si se declara con el inyector de dependencia por defecto de .NET:
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;
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:
/// <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::
/// <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;
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:
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: