Ejercicio: crear una nueva extensión de Retail Server

Completado

Las extensiones de Retail Server se utilizan como servicios para exponer la lógica de Commerce Runtime. Para crear una extensión de Retail Server, siga estos pasos:

  1. Cree la extensión de CRT antes de crear la extensión de Retail Server. Una API de Retail Server no debe tener lógica excepto la lógica que llame al CRT con los parámetros.
  2. Cree un nuevo proyecto de biblioteca de clase C# que utilice Microsoft .NET Framework versión 4.6.1, o bien utilice cualquiera de los ejemplos de Retail Server en el SDK de Commerce como plantilla.
  3. En el proyecto de extensión de Retail Server, agregue una referencia a su biblioteca de extensiones o proyecto de CRT. Esta referencia le permite llamar la solicitud, la respuesta y las entidades de CRT.
  4. En el proyecto de extensión de Retail Server, agregue el paquete Microsoft.Dynamics.Commerce.Hosting.Contracts mediante el administrador de paquetes NuGet. Los paquetes NuGet se encuentran en la carpeta RetailSDK\pkgs.
  5. Cree una nueva clase controller y extiéndala desde IController. Esta clase controller contendrá el método que la API de Retail Server debe exponer. Dentro de la clase controller, agregue métodos para llamar la solicitud de CRT. No extienda la nueva clase de controlador a partir de las clases de controlador existentes como CustomerController y ProductController. Las clases de extensión deben extender solo la clase IController.
  6. Agregue el atributo RoutePrefix en la clase controller para vincularlo a una entidad. Si no está vinculado a una entidad, este atributo no es obligatorio. El atributo BindEntity es obligatorio en una clase controller si va a crear un nuevo controlador y a exponer una entidad.

El siguiente código de muestra crea una API de Retail Server sencilla para devolver una entidad, una cadena y un valor booleano. La solicitud y la respuesta de CRT que se utilizan en la muestra no se incluyen en esta muestra. Para ver un ejemplo de solicitud y respuesta de CRT, consulte la extensibilidad y los desencadenadores de Commerce Runtime (CRT).

```csharp
/// <summary>
    /// New extended controller.
    /// </summary>
    [RoutePrefix("SimpleExtension")]  
    [BindEntity(typeof(SimpleEntity))]

    public class SimpleExtensionController : IController
    {
        /// <summary>
        /// The action to get the string value.
        /// </summary>
        /// <param name="context">The context parameters.</param>
        /// <param name="stringValue">The string value parameters.</param>
        /// <returns>The string value.</returns>
        [HttpPost]
        [Authorization(CommerceRoles.Customer, CommerceRoles.Employee)]
        public async Task<string> GetStringValue(IEndpointContext context, string stringValue)
        {
            GetStringValueResponse resp = await     context.ExecuteAsync<GetStringValueResponse>
            (new GetStringValueRequest(stringValue)).ConfigureAwait(false);
            return resp.StringValue;
        }

        /// <summary>
        /// The action to get the bool value.
        /// </summary>
        /// <param name="context">The context parameters.</param>
        /// <param name="boolValue">The string value parameters.</param>
        /// <returns>The bool value.</returns>
        [HttpPost]
        [Authorization(CommerceRoles.Customer, CommerceRoles.Employee)]
        public async Task<bool> GetBoolValue(IEndpointContext context, string boolValue)
        {
        GetBoolValueResponse resp = await context.ExecuteAsync<GetBoolValueResponse>
        (new GetBoolValueRequest(boolValue)).ConfigureAwait(false);
        return resp.BoolValue;
    }

        /// <summary>
        /// The action to get the simple entity.
        /// </summary>
        /// <param name="context">The context parameters.</param>
        /// <param name="name">The name parameters.</param>
        /// <returns>The simple entity.</returns>
        [HttpPost]
        [Authorization(CommerceRoles.Customer, CommerceRoles.Employee)]
        public async Task<SimpleEntity> GetSimpleEntity(IEndpointContext context, string name)
        {
            GetSimpleEntityResponse resp = await context.ExecuteAsync<GetSimpleEntityResponse>
            (new GetSimpleEntityRequest(name)).ConfigureAwait(false);
            return resp.SimpleEntityObj;
        }
```
  1. Construya el proyecto de extensión y copie el binario a la carpeta \RetailServer\webroot\bin\Ext.

  2. Actualice el archivo web.config de Commerce Scale Unit en la carpeta \RetailServer\webroot agregando el nuevo nombre de biblioteca de extensión en la sección extensionComposition.

    <extensionComposition>
    <!-- Use fully qualified assembly names for ALL if you need to support loading from the Global Assembly Cache.
    If you host in an application with a bin folder, this is not required. -->
    <add source="assembly" value="SimpleExtensionSample" >
    </extensionComposition>
    
  3. En Microsoft Internet Information Services (IIS), reinicie la Commerce Scale Unit para cargar la nueva extensión.

  4. Para comprobar si la extensión se ha cargado correctamente, puede examinar los metadatos de Retail Server. Confirme si sus entidades y métodos aparecen en la lista. Para examinar los metadatos, abra una URL en el siguiente formato en un navegador web: https://RS-URL/Commerce/$metadata

  5. Para llamar a la extensión de Retail Server en su cliente, debe generar el proxy TypeScript del cliente. A continuación, puede utilizar el proxy para llamar a sus nuevas API de Retail Server desde el cliente. No es necesario agregar ni incluir archivos EdmModelExtender en la extensión con las API de extensiones de Retail Server. Los archivos solo son necesarios si se utiliza el SDK de Commerce versión 10.0.10 o anterior. Puede usarse una extensión de Retail Server que se crea con la API Microsoft.Dynamics.Commerce.Hosting.Contracts nueva en una implementación sin conexión. No es necesario generar una biblioteca de proxys C# aparte. Copie la biblioteca de extensiones de Retail Server en la carpeta \Microsoft Dynamics 365\70\Retail Modern POS\ClientBroker\ext y luego actualice el archivo de configuración RetailProxy.MPOSOffline.ext para incluir esta nueva biblioteca. La extensión debe generar solo el proxy de TypeScript. Las muestras de SDK se pueden encontrar en la carpeta \RetailSDK\SampleExtensions\TypeScriptProxy. El siguiente ejemplo muestra cómo actualizar el elemento add en el archivo de configuración RetailProxy.MPOSOffline.ext.

    <?xml version="1.0" encoding="utf-8"?> 
    <retailProxyExtensions> 
        <composition> 
            <add source="assembly" value="Contoso.RetailServer.StoreHoursSample" /> 
        </composition> 
    </retailProxyExtensions>