Из моего личного опыта, это rocksolid подход:
- Вы предотвратить создание экземпляра более одного экземпляра Dataset
- Вы его доступным во всем мире, которая является то, что вы хотите, и делает жизнь проще
Однако ООП-Фанатики будут утверждать, что вы не должны использовать классическую Банда четырех Singleton (со статическим Instance собственности), но в DI Singleton, объект, который создается с помощью DI контейнер только один раз, а затем проходил повсюду.
Лично я считаю, что это компромисс: GoF Singleton прост в использовании и прост. У меня никогда не было случая, когда я должен был заменить его или доступ к базе данных в целом. У меня есть интерфейс для доступа к базе данных, и при необходимости я могу изменить реализацию в Singleton (и улучшить ее, чтобы это было возможно даже во время выполнения). Он также может сэкономить вам много кода шаблона, но имейте в виду, что ваша модель тогда очень тесно связана с базой данных и не может существовать без нее.
Единственное преимущество материала DI, которое я вижу, это то, что вы можете настроить его из внешней конфигурации, поскольку я сомневаюсь, что управление жизненным циклом доступа к базе данных будет когда-либо изменено, что будет другим преимуществом DI. И ваш ObjectModel может быть очищен в долгосрочной перспективе (плюс для больших проектов).
Мне лично нравится использовать эту общую реализацию Singleton. Некоторые фетишисты-объекты снова будут утверждать, что это скорее обертка, чем синглтон, но она хорошо справляется и даже позволяет вам сохранять свои объекты ObjectModels («в отличие от ViewModels», не ошибайтесь) чистыми, поскольку вам не нужно реализовать их как одиночка со статическими членами:
public class Singleton<T> where T : class {
static object SyncRoot = new object();
static T instance;
public static T Instance {
get {
if (instance == null) {
lock (SyncRoot) {
if (instance == null) {
ConstructorInfo ci = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
if (ci == null) { throw new InvalidOperationException("class must contain a private constructor"); }
instance = (T)ci.Invoke(null);
}
}
}
return instance;
}
}
}
http://www.sanity-free.com/132/generic_singleton_pattern_in_csharp.html
Извините, если это немного густой вопрос, но что значит «потерять»? – Moonshield 2010-12-02 13:39:01
Извините, это означает, что не применяет правила и ограничения модели, оно может содержать что угодно. – Aliostad 2010-12-02 13:48:27