Trabajando en la nueva versión de nuestro producto, me han encomendado como tarea integrar parte de la aplicación con SharePoint Online, en concreto con la parte de búsquedas para encontrar conocimiento relacionado, ya sean documentos, personas, comunidades… Cada vez que me enfrento a una situación como esta en mi día a día, siempre trato de encontrar la mejor solución al problema, como en este caso me vino a la cabeza el uso del patrón Proxy.

Definición

Se trata de un patrón estructural y se utiliza como intermediario para controlar el acceso a otro objeto. En mi caso lo voy a usar como proxy remoto para acceder a los servicios REST de SharePoint Online desde nuestra API. Suele ser muy habitual usar este patrón para hacer llamadas RPC, HTTP o para usar librerías externas.

Diagrama UML

 

 

 

 

 

 

 

 

 

Código de ejemplo

Cliente

El cliente en mi caso será nuestra API. Desarrollada con ASP.NET WebApi 2. Usaremos el Proxy desde los métodos de nuestro controlador.

Subject

public abstract class SearchEngine
{
    public abstract IList<People> FindPeopleBy(string query);
}

RealSubject

public class SharePointOnlineSearchEngine : SearchEngine
{
    public override IList<People> FindPeopleBy(string query)
    {
        var accessToken = GetAccessToken();
        var spHostUrl = GetSharePointOnlineHostUrl();
        var authority = GetAuthority();

        using (var clientContext = TokenHelper.GetClientContextWithContextToken(spHostUrl, token, authority))
        {
            ///Search people
        }
        return people;
    }

    ///...
}

Proxy

public class SearchEngineProxy : SearchEngine
{
    private readonly SharePointOnlineSearchEngine _searchEngine;

    public Proxy()
    {
        _searchEngine = new SharePointOnlineSearchEngine();
    }

    public override IList<People> FindPeopleBy(string query)
    {
        return _searchEngine.FindPeopleBy(query);
    }
}

De esta forma encapsulamos solo la funcionalidad que vamos a necesitar de SharePoint Online a través de nuestro proxy.

Referencias

Un saludo.