Обновление
Кажется, что в более новых версиях Docker и Ubuntu файл модуля для Docker просто маскируется (указывая на /dev/null).
Вы можете проверить это, выполнив в терминале следующие команды:
sudo file /lib/systemd/system/docker.service
sudo file /lib/systemd/system/docker.socket
Вы должны увидеть, что файл модуля содержит ссылки на /dev/null.
. В этом случае все, что вам нужно сделать, это следовать предложению S34N и выполнить:
sudo systemctl unmask docker.service
sudo systemctl unmask docker.socket
sudo systemctl start docker.service
sudo systemctl status docker
Я также сохраню исходный пост, который отвечает на журнал ошибок, в котором говорится, что драйвер хранилища должен быть заменен:
Исходное сообщение
У меня была та же проблема, и я попытался исправить ее с предложением Сальвы Корта, но печать /etc/default/docker
говорит:
# Этот файл не применяется к SYSTEMD
Итак, вот постоянное исправление , которое работает для systemd (Ubuntu 15.04 и выше):
создайте новый файл /etc/systemd/system/docker.service.d/overlay.conf
следующего содержания:
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// -s overlay
сбросить изменения, выполнив:
sudo systemctl daemon-reload
verify что конфигурация была загружена:
systemctl show --property=ExecStart docker
перезапустите докер:
sudo systemctl restart docker
Я бы классифицировал это как объект домена или бизнес-объект. Одним из преимуществ этого типа дизайна является то, что он сохраняет независимость модели от любой бизнес-логики и их можно повторно использовать в различных средах.
Второй класс может быть классифицирован как DAO (объект доступа к данным).
Этот шаблон вообще не является анти-упом и широко используется.
В то время как ваш класс user.cs предоставляет себя объекту передачи домена , класс Users.cs, по сути, является тем местом, где вы можете применять бизнес-правила внутри объектов доступа к данным .
Вы можете подумать о соглашении об именах ваших классов вместе с пространствами имен. Когда я смотрю на users.cs, я предполагаю, что это, по сути, класс для работы со списком пользователей.
Другой вариант - изучить Active Record Pattern , который объединит два созданных вами класса.
User.cs
public class User
{
public string Username { get; set; }
public string Password { get; set; }
public User(int userID)
{
//data connection
//get records
this.Username = datarecord["username"];
this.Password = datarecord["password"];
}
}
Похоже, это может быть шаблон репозитория , это, кажется, становится все более распространенным шаблоном и используется для большого эффекта в примере Витрина Роба Конери Приложение Asp.Net MVC.
По сути, вы абстрагируете свой код доступа к данным от Модели, что в целом хорошо. Хотя я бы надеялся на немного смелости в модельном классе. Также из предыдущего опыта называть это пользователями сбивает с толку, UserRepository может быть лучше. Также можно рассмотреть возможность удаления статики (что является горячим спором), но упрощает издевательство. Кроме того, в репозитории должен быть реализован интерфейс, чтобы вы могли смоделировать его и, следовательно, заменить его фальшивым позже.
Первый класс является анти-ООП, потому что он содержит данные без поведения, типичный пример модели анемичной области . Это типично для людей, которые занимаются процедурным программированием на объектно-ориентированном языке.
Однако мнения разделились относительно того, имеет ли смысл помещать логику доступа к БД в саму модель предметной области (шаблон активной записи) или, как в вашем коде, в отдельный класс (шаблон объекта доступа к данным), поскольку доступ к БД является отдельной технической проблемой, которая не обязательно должна быть тесно связана с моделью предметной области.
Это не совсем объектно-ориентированный подход в каком-либо смысле, поскольку объект представляет собой не что иное, как скопление слипшихся данных. Не то чтобы это ужасно.