Os Generics trouxeram um grande poder às linguagens .NET. O tipos genéricos podem ser utilizados por toda a classe onde ele está sendo criado e, consequentemente, podemos utilizar em seus construtores. O maior problema da criação de objetos que exigem um parâmetro genérico, é a necessidade de especificarmos esses tipos durante a sua construção, ou seja, o construtor não é capaz de inferir os tipos, o que torna o código um pouco ilegível. Para exemplificar, considere o seguinte código:
public class ProxyManager<TChannel, TBinding>
{
private TChannel _channel;
private TBinding _binding;
public ProxyManager(TChannel channel, TBinding binding)
{
this._channel = channel;
this._binding = binding;
}
//Outros Membros
}
Durante a sua criação, é necessário especificarmos os tipos genéricos para depois conseguir parametrizar o construtor com os valores efetivos. Se repararmos o código abaixo, note que não podemos omitir o que está entre os caracteres < e >, mesmo que construtores são uma espécie de método, eles não possibilitam a omissão dos mesmos, assim como acontece nos métodos genéricos.
var manager =
new ProxyManager<ServicoDeUsuariosClient, NetTcpBinding>(
new ServicoDeUsuariosClient(),
new NetTcpBinding());
Para melhorar esse código e torná-lo mais simples de consumir a classe, podemos recorrer a criação de uma nova classe, que conterá um método estático que aceita exatamente os parâmetros genéricos exigidos pelo construtor da classe ProxyManager<TChannel, TBinding>, e o retorno será a própria classe criada, uma espécie de factory. O que acontece aqui é que todo o código burocrático acaba ficando dentro deste método.
public static class ProxyManager
{
public static ProxyManager<TChannel, TBinding> Create<TChannel, TBinding>(TChannel channel, TBinding binding)
{
return new ProxyManager<TChannel, TBinding>(channel, binding);
}
}
Com isso, a criação de um novo ProxyManager, se resume simplesmente ao código que vemos abaixo:
var manager =
new ProxyManager.Create(new ServicoDeUsuariosClient(), new NetTcpBinding());