Цель
Написать эффективную библиотеку Active Directory, чтобы упростить работу технических специалистов, ответственных за создание моделей доступа в Active Directory контроллера домена. Эта библиотека должна разрешать следующее:
- Основные операции: добавление, изменение, удаление, список записей;
- Запись может быть организационной единицей, группой или пользователем (больше не требуется на данный момент);
Я думал о том, чтобы иметь класс, который представлял бы область, с которой мы хотим работать.
public class Domain {
public Domain(string root) {
Root = root;
Entries = new Dictionary<string, IDirectoryEntry>();
}
public string Root { get; private set; }
public Dictionary<string, IDirectoryEntry> Entries { get; private set; }
}
Затем я использовал внедрение зависимостей, чтобы навязать ограничение принадлежности к домену записи. Например:
public abstract class DirectoryEntry : IDirectoryEntry {
public DirectoryEntry(Domain domain, string name) {
Domain = domain;
Name = name;
Domain.Entries.Add(name, this);
}
public Domain { get; private set; }
public Name { get; set; }
}
public class OrganizationalUnit : DirectoryEntry {
public OrganizationalUnit(Domain domain, string name)
: base(domain, name) {
}
}
public class Group : DirectoryEntry {
public Group(Domain domain, string name)
: base(domain, name) {
}
}
Теперь обратите внимание, что я добавляю запись с использованием Domain.Entries.Add()
в данный домен после создания интерфейса IDirectoryEntry
.
Вопросы
Является ли это хорошей практикой, если я не хочу, чтобы пользователь изменял свойство Domain
любых экземпляров IDirectoryEntry
?
Было бы предпочтительнее просто пропустить эту строку Domain.Entries.Add()
и добавить в мой класс Domain
метод, который бы добавил запись в домен?
Пример кода для вопроса № 2
public class Domain {
//See above for other members.
public void AddEntry<T>(T entry) {
Entries.Add(entry.Name, entry);
}
}
- Какая, по вашему мнению, лучшая архитектура в этой ситуации?
Обе, кажется, достаточно хороши, чтобы их можно было рассмотреть, поэтому я немного озадачен желанием Самый простой способ для конечных пользователей библиотеки.