Это немного идиотский вопрос, так что вы должны простить меня, но я программист-самоучка, и хорошая, чистая архитектура часто ставит меня в тупик.Я учусь на таких вопросах, как этот:)
Так что мне нужно кодировать класс доступа к данным для взаимодействия с базой данных NoSQL.Проблема в том, что мы хотим оставить себя открытыми для изменения нашей платформы NoSQL на более позднем этапе, поэтому мне нужно сделать эту зависимость между моим классом и фактическим доступом к данным настолько свободной, насколько это возможно.
Набросать это вЯ подумал, что лучший способ сделать это - создать интерфейс, подобный следующему:
public interface INoSql
{
string ServerLocation
{
get; set;
}
string DatabaseName
{
get; set;
}
string CollectionName
{
get; set;
}
void SaveChanges(List<NoSqlItem> nsCollection);
}
, а затем создать специальный класс доступа к данным, который будет выглядеть следующим образом для MongoDB
* 1009.*
Пока все просто - все, что мне нужно сделать, - это убедиться, что любой класс, использующий уровень доступа к данным, ссылается только на интерфейс, а затем, если мы хотим поменяться с другим поставщиком NoSQL, все, что мне нужно сделать, это перекодировать новыйкомпонент доступа к данным, реализующий тот же интерфейс, верно?Ну, если подумать, проблема возникает, когда я хочу использовать это.Потому что это, очевидно, не сработает:
INoSql noSQLConnection = new INoSql;
Поскольку вы не можете создать экземпляр интерфейса.
Так, каково решение, чтобы мой код был красивым и свободным?Чтение вокруг выглядит так, как будто один ответ состоит в том, чтобы вставить его в конструктор:
public class MyClass
{
private INoSql NoSql;
public myClass(INoSql NoSql)
{
this.NoSql = NoSql;
}
}
Что выглядит аккуратно, но разве это не устраняет проблему?Потому что тогда вам придётся создавать конкретную версию чего-то, что реализует INoSql, когда вы создаете MyClass, да, и это должно быть MongoDBConnection - или что угодно - вместо слабо связанного класса?
Очевидно, я что-то пропустил, но что?И есть ли другие решения этой распространенной проблемы?
Cheers, Matt