Я пытаюсь создать один объект, который будет отвечать за чтение всех параметров доступа пользователей.Убедитесь, что Singleton вызывает запрос db только один раз
Я создал класс, как так:
public class SettingsManager
{
private static string _connString =
@"Data Source=MyDB;Initial Catalog=IT;Integrated Security=True;Asynchronous Processing=true;";
private const string _spName = "SettingTest";
private IEnumerable<string> _mySettings;
private static readonly Lazy<SettingsManager> _instance = new Lazy<SettingsManager>(() => new SettingsManager());
private SettingsManager()
{
//Console.WriteLine("Hello from constructor");
if (_mySettings == null)
_mySettings = ReadSettings();
}
public static SettingsManager Instance
{
get { return _instance.Value; }
}
public bool CanDo(string setting)
{
return _mySettings.Contains(setting);
}
private IEnumerable<string> ReadSettings()
{
try
{
using (var conn = new SqlConnection(_connString))
{
using (var cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = _spName;
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
using (var reader = cmd.ExecuteReader())
{
return reader.Select(SettingParser).ToList();
}
}
}
}
catch
{
}
return null;
}
private string SettingParser(SqlDataReader r)
{
try
{
return r[0] is DBNull ? null : r[0].ToString();
}
catch
{
}
return null;
}
}
И SqlDataReader Extension
public static class DBExtensions
{
public static IEnumerable<T> Select<T>(
this SqlDataReader reader, Func<SqlDataReader, T> projection)
{
while (reader.Read())
{
yield return projection(reader);
}
}
}
Тогда внутри моего приложения, я могу назвать это как так:
SettingsManager.Instance.CanDo("canWrite")
это возвращает значение true/false, зависит от уровня доступа пользователя.
Мои вопросы:
Это поточно? Есть ли шансы, что БД будет запросить несколько раз? Как предотвратить это?
Должен ли я использовать ожидание и асинхронный режим? Я запрашиваю db только один раз. Как я могу улучшить это? (Await и асинхронной действительно являются новыми для меня, потому что я только что переехал из .NET3.5 до 4,5)
http://csharpindepth.com/Articles/General/Singleton.aspx –
@Ravi - Я использую один из этой модели - Lazy <> – Misiu
@Ravi - http://geekswithblogs.net/BlackRabbitCoder/archive/ 2010/05/19/c-system.lazylttgt-and-the-singleton-design-pattern.aspx LazySingleton3 – Misiu