Я просто создаю интерфейс для своего источника данных, а затем внедряю его для каждого типа источника данных, который мне нужно использовать. Обычно они выглядят примерно так:
public interface IMyProjectDataSource
{
IEnumerable<string> GetUserNames();
void AddUser(string userName);
}
public class SqlServerMyProjectDataSource : IMyProjectDataSource
{
public SqlServerMyProjectDataSource(string connectionString)
{
//...
}
public IEnumerable<string> GetUserNames()
{
//...
}
public void AddUser(string userName)
{
//...
}
}
public class PostgreSqlMyProjectDataSource : IMyProjectDataSource
{
public IEnumerable<string> GetUserNames()
{
//...
}
public void AddUser(string userName)
{
//...
}
}
public class HttpCacheSqlMyProjectDataSource : IMyProjectDataSource
{
public HttpCacheSqlMyProjectDataSource(IMyProjectDataSource parentMyProjectDataSource)
{
}
public IEnumerable<string> GetUserNames()
{
//...
}
public void AddUser(string userName)
{
//...
}
}
Мне это тоже нравится, потому что это позволяет вам "связать" их вместе. Например, вы можете выполнять кэширование всех источников данных следующим образом:
public class HttpCacheSqlMyProjectDataSource : IMyProjectDataSource
{
public HttpCacheSqlMyProjectDataSource(IMyProjectDataSource parentMyProjectDataSource)
{
//...
}
public IEnumerable<string> GetUserNames()
{
//...
}
public void AddUser(string userName)
{
//...
}
}
Самое сложное - это решить, как его создать, особенно если вы планируете объединить в цепочку более одного. Для этого я обычно сохраняю его в своем Global.asax.cs как одиночный файл и создаю его из имени типа в файле .config. Вы можете использовать Type.GetType (), а затем Activator.CreateInstance (), чтобы сделать это, и большая часть цепочки, которую я имею, будет сделана независимо от того, какой источник данных в .config, поэтому мне не нужно беспокоиться о создании некоторых своего рода тип "конструктор" или сложный .config.
Надеюсь, это имеет смысл. Возможно, это не лучший вариант для всех ситуаций, но мне повезло с этим.