Сделать класс доступным только одному другому классу - PullRequest
2 голосов
/ 18 августа 2010

У меня есть проект C #, в котором я использую шаблон Memento / Command для реализации функциональности Undo / Redo.Приложение представляет собой приложение WPF, которое использует StructureMap для IOC, имеет обширные модульные тесты и использует моделирование через интерфейсы с использованием RhinoMocks.

В моем коде у меня есть класс Operation, который представляет все отменяемые операции, итакже есть интерфейс IRepositoryWriter, через который маршрутизируются все записи в базу данных.

Мне интересно, каков наилучший способ применения политики, которая должна быть в состоянии только Operation и его производные классыиспользовать IRepositoryWriter.

Очевидный способ добиться этого - сделать IRepositoryWriter защищенным вложенным интерфейсом Operation.

Преимущества : только Operation и производные классы имеют доступ к IRepositoryWriter.

Недостатки : больше не может использоваться с StructureMap или Unit Tested.

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

Ответы [ 5 ]

2 голосов
/ 18 августа 2010

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

Lib1
    UI code
Lib2
    Operation and derived classes
Lib3
    IRepositoryWriter and implementation

Только Lib2 должен иметь ссылку на Lib3. Вы могли бы даже использовать InternalsVisibleToAttribute, чтобы гарантировать, что внутренние компоненты Lib3 видны только для Lib2 и сделать IRepositoryWriter и реализацию (и) internal.

Таким образом, вы все еще можете иметь все модульные тесты, которые вы хотите. Конечно, нет ничего, что мешало бы другому разработчику создать ссылку с Lib1 на Lib3, но это намного проще реализовать.

1 голос
/ 18 августа 2010

Как насчет замены IRepositoryWriter на RepositoryWriter конструктором, который принимает операцию в качестве параметра?

1 голос
/ 18 августа 2010

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

/// <summary>
///    blah blah, what this interface is for
/// </summary>
/// <remarks>
///   This interface should only be implemented by inheritors of Operation.
/// </remarks>
public interface IRepositoryWriter{}

Просто указав очевидное решениедля тебя.;)

0 голосов
/ 18 августа 2010

Ключевое слово internal ограничивает доступ к классу для элементов в пределах одной сборки, т. Е. Внутренний класс не виден вне сборки - поместите подклассы Operation, Operation и IRepositoryWriter в одну сборку с помощьюСам

0 голосов
/ 18 августа 2010

Возможно, в этом случае излишне, но если вы абсолютно обязаны придерживаться принципа СУХОЙ, вы можете написать какой-нибудь скрипт для изменения только файлов .cs, которым нужен интерфейс - скрипт может прочитать файл, представляющий собой просто список классов, которыеразрешено реализовывать интерфейс.Таким образом, вы можете вкладывать интерфейс в каждый класс, который его использует, включая модульные тесты без какого-либо дублирования знаний.Конечно, недостатком является то, что вы вводите совершенно новый уровень сложности.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...