Как поменять классы с одинаковыми именами и разными пространствами имен? - PullRequest
0 голосов
/ 21 декабря 2018

Я прочитал сообщение в блоге Шаблон проектирования репозитория

Основная идея статьи - создавать классы с одинаковыми именами, чтобы получить больше функциональности.Все хорошо, я понимаю.Но я не могу понять этот код:

repository.query(new NewestNewsesSpecification());

У него есть NewestNewsesSpecification для sql и NewestNewsesSpecification для Realm.

Итак, мой вопрос - как программа может понять, какую реализацию NewestNewsesSpecification использовать, если классы имеют одинаковые имена, но в разных пространствах имен?Это даже не структура DI.Или просто каждый раз, когда мне нужно другое хранилище, мне нужно находить и изменять пространства имен в файлах исходного кода?

Код статьи написан на Java.Я пишу на C #.

1 Ответ

0 голосов
/ 21 декабря 2018

Я просто очень быстро прочитал статью.Он объясняет Шаблон Репозитория.Это помогает инкапсулировать детали реализации реального используемого хранилища.Таким образом, вы можете поменять базовые репозитории без изменения вашего клиентского кода.Базовые детали инкапсулированы в классе Specification.Вы должны явно передать реализацию этого базового класса в хранилище, например, в метод 'query'.Это тот момент, когда вы, клиент, должны решить, какой репозиторий использовать (или запросить), создав соответствующий экземпляр.

Если у вас есть несколько реализаций, использующих одно и то же имя, они должны находиться в другом пространстве имен, чтобы избежать двусмысленности.Вы правы, если предположите, что компилятор не может разрешить эти конфликтующие ссылки.Обычно вы должны полностью определить тип (например, instantiation, cast): 'new Sql.NewestNewsesSpecification ()' или использовать директиву компилятора 'using' или 'import', чтобы объявить соответствующее пространство имен, чтобы можно было использовать краткую форму: 'newewestNewsesSpecification () '.В статье предполагается, что вы включаете либо пространство имен «Sql», либо пространство имен «Realm».Основная идея заключалась в том, чтобы показать, какие части кода будут меняться при замене основного репозитория (контекста).Если вы включаете оба пространства имен одновременно, вы можете указать псевдоним для одной из реализаций или использовать полностью определенные ссылки, чтобы ссылки больше не были неоднозначными.

...