Инкапсулируйте каждую базу данных в соответствии с Стратегией - когда речь идет о базах данных, мы часто называем их Хранилища .Теперь вы можете инкапсулировать обе реализации за Composite , который направляет запрос.
Представьте, что у нас есть интерфейс IRepository.Вы можете направить их следующим образом:
public class RoutingRepository : IRepository
{
private readonly IRepository repository1;
private readonly IRepository repository2;
public RoutingRepository(IRepository repository1, IRepository repository2)
{
if (repository1 == null)
{
throw new ArgumentNullException("repository1");
}
if (repository2 == null)
{
throw new ArgumentNullException("repository2");
}
this.repository1 = repository1;
this.repository2 = repository2;
}
public SomeEntity SelectEntity(int id)
{
if (this.UseRepository1())
{
return this.repository1.SelectEntity(id);
}
else
{
return this.repository2.SelectEntity(id);
}
}
// more IRepository members can go here...
private bool UseRepository1()
{
// implement routing logic here...
}
}
Клиенты будут видеть только интерфейс IRepository, поэтому в соответствии с принципом замены Лискова *1013* они никогда не узнают разницу.