Это в порядке для помещения вызова инициализации базы данных в конструктора C#? [закрытый]

[g7] Поскольку решение [g0] Grid [/g0] еще не было представлено, оно здесь, с двумя объявлениями [g4] [/g4] для родительского элемента [g5] [/g5], если мы возьмите [f3] и [f4] как должное: [/g7] [g8] [g2] [f1] [f2] [/g2] [/g8] [g10] [g6] [g1] [f5] [/g1] [/g6] [/g10]
[g9] Элементы равномерно распределены внутри контейнера выравнивания вдоль поперечной оси. Интервал между каждой парой соседних предметов одинаков. Первый элемент находится на одном уровне с основным краем, а последний элемент находится на одном уровне с основным краем. [/G9]
9
задан Bob King 1 October 2008 в 21:44
поделиться

7 ответов

Существует несколько причин, это обычно не считают хорошим дизайном, некоторые из которых как порождение трудного поблочного тестирования и трудности ошибок из-за неправильного обращения были уже упомянуты.

Главная причина, которую я принял бы решение не сделать так, состоит в том, что Ваш объект и уровень доступа к данным теперь очень сильно связаны, что означает, что любое использование того объекта за пределами него, которого первоначальный проект требует значительный, переделывает. Как пример, что, если Вы столкнулись с экземпляром, где необходимо было использовать тот объект без каких-либо значений, присвоенных, например, сохранять новый экземпляр того класса? теперь или необходимо перегрузить конструктора и затем удостовериться, что вся другая логика обрабатывает этот новый случай, или наследуйте и переопределите.

Если бы объект и доступ к данным были отделены затем, то Вы могли бы создать экземпляр и затем не гидратировать его. Или если Ваш имеют другой проект, который использует те же объекты, но использует другой слой персистентности затем, объекты являются допускающими повторное использование.

Сказав, что я выбрал более легкую путь из связи в проектах в прошлом :)

10
ответ дан 4 December 2019 в 06:31
поделиться

Хорошо.. Я не был бы. Но с другой стороны мой подход обычно включает класс, НЕ являющийся ответственным за получение его собственных данных.

11
ответ дан 4 December 2019 в 06:31
поделиться

Да, Вы, CAN делает это, но это не лучший дизайн и обработка ошибок в конструкторах, не так опрятны как в другом месте.

4
ответ дан 4 December 2019 в 06:31
поделиться

Это будет также мешать писать модульные тесты на класс, поскольку Вы не сможете вынудить класс использовать Ложную/Тупиковую версию класса дб. Посмотрите здесь: http://en.wikipedia.org/wiki/Dependency_injection

7
ответ дан 4 December 2019 в 06:31
поделиться

Можно использовать доступный шаблон, если Вы обращаетесь к соединению с БД:

public class MyClass : IDisposable
{
    private Database db;
    private int? _id;

    public MyClass()
    {
        db = new Database();
    }

    public int Id
    {
        get
        {
            if (_id == null) _id = db.GetIdFor(typeof(MyClass));
            return _id.Value;
        }
    }

    public void Dispose()
    {
        db.Close();
    }
}

Использование:

using (var x = new MyClass()) 
{
    /* ... */

} //closes DB by calling IDisposable.Dispose() when going out of "using" scope
7
ответ дан 4 December 2019 в 06:31
поделиться

Единственная проблема, о которой я могу думать с этим подходом, состоит в том, что любые ошибки от инициализации DB будут распространены как исключения от конструктора.

1
ответ дан 4 December 2019 в 06:31
поделиться

Почему кто-либо хотел бы использовать фиктивный объект / тупик вместо реальной вещи? Вы согласились бы, что автопроизводители должны использовать модели строительного картона для испытаний на ударную прочность при столкновении?

-3
ответ дан 4 December 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: