Estou trabalhando num projeto que acessa vários bancos de dados e em momentos diversos. Por isso resolvi implementar uma solução que encapsulasse o Command.SetConnection(DataBaseType, ConnectionString) para facilitar o desenvolvimento. E claro, meu projeto possui as camadas de negócio e apresentação bem delimitados e portanto, não poderia ficar acessando a classe Command em vários pontos do meu projeto sempre que fosse alterar o banco de dados que iria acessar.

Com este cenário criei uma classe que resolve isso, seguindo o conceito já implementado em outros frameworks de persistência como NHibernate, criei uma estrutura de “Contexto” da seguinte forma:

public sealed class Context : IDisposable
{    
    public Context(string applicationAlias)
    {
        var app = Command.GetConnectionSettings(applicationAlias);
        Command.SetConnection((DataBaseType) Command.GetDataBaseTypeByName(app.ProviderName), app.ConnectionString);
    }

    public void Dispose()
    {
        var settings = Command.GetDefaultConnectionSettings();
        Command.SetConnection((DataBaseType) Command.GetDataBaseTypeByName(settings.ProviderName), settings.ConnectionString);
    }
}

Agora fica fácil alterar se um bloco de código irá acessar outra base de dados sem expor seus Command´s. Bastará, definir outras conexões em seu Web.Config.

    <connectionstrings>
        <remove name="dbPortal" />
        <add connectionstring="conexão padrão" providername="System.Data.SqlClient" name="dbPortal" />
        <add connectionstring="conexão da aplicação adicional 01" providername="System.Data.SqlClient" name="aplicacao01" />
        <add connectionstring="conexão da aplicação adicional 02" providername="System.Data.SqlClient" name="aplicacao02" />
    </connectionstrings>
protected void botao_Click(object sender, EventArgs e)
{

    DefaultDataBase objDefault = new DefaultDataBase();
    objDefault.Name = "dbPortal";
    objDefault.Descripition = "Objeto que será persistido no banco padrão, ou seja, conexão 'dbPortal'.";
    objDefault.Save();    

    using (new Context("aplicacao1"))
    {
         OtherDataBase objOther1 = new OtherDataBase();
         objOther1.Name = "Aplicação 01";
         objOther1.Descripition = "Objeto que será persistido no banco definido na conexão de nome 'aplicacao01'.";
         objOther1.Save();
    }

    using (new Context("aplicacao2"))
    {
         OtherDataBase objOther2 = new OtherDataBase();
         objOther2.Name = "Aplicação 02";
         objOther2.Descripition = "Objeto que será persistido no banco definido na conexão de nome 'aplicacao02'.";
         objOther2.Save();
    }

}

Estou fazendo testes finais, mas até agora parece que não interferiu em nenhuma funcionalidade do framework e muito menos criou algum tipo de limitação. Ou seja, creio que em breve este tipo de solução será nativa do Paulovich.Data. Aguardem novos Builds.

Abraços,