KnownTypes dinâmicos


Para lidar com classes e suas derivações em serviços, o WCF disponibiliza um recurso chamado Known Types. Com ele, é possível ter um método que defina como retorno um tipo base e, em seu interior, criar e retornar tipos derivados.

Para expor os tipos derivados a partir deste recurso, como se pode ver no artigo mencionado acima, voce deverá decorar a Interface ou os métodos que ela possuir  (se quiser ser mais restritivo) com o atributo ServiceKnownTypeAttribute. No artigo podemos ver que os tipos derivados são declarados estaticamente. Caso voce queira tornar a configuração dos known types do serviço de forma dinamica, voce poderá criar um método que retorne os tipos que serão suportados pelo serviço, como é mostrado abaixo:

private static class ServiceContractHelper
{
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
    {
        List<Type> knownTypes = new List<Type>();
        knownTypes.Add(typeof(Fisica));
        knownTypes.Add(typeof(Juridica));

        return knownTypes;
    }
}

Para que essa técnica funcione, é necessário que voce defina a assinatura do método como é mostrado acima, podendo variar o nome. Em seguida precisamos vincular esta classe ao contrato e, para isso, utilizamos um dos overloads do construtor do atributo ServiceKnownTypeAttribute que, receberá uma string contendo o nome do método que fornecerá os tipos e, um Type representando o tipo da classe que fornece o método.

[ServiceContract]
[ServiceKnownType(“GetKnownTypes”, typeof(ServiceContractHelper))]
public interface IGerenciadorDeContatos
{
    //métodos
}

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s