Цель
Чтобы написать юбилеи, библиотеку 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);
}
}
- Что, по вашему мнению, лучшая архитектура в этой ситуации?
Оба кажутся достаточно хорошими, чтобы их можно было рассмотреть, поэтому я немного смущен тем, что он хочет, чтобы самый простой способ для конечных пользователей библиотеки.
Спасибо Нейт. К сожалению, мой клиент запрещает мне использовать .NET 2.0, иначе я бы использовал 3.5. Кроме того, я не боюсь быть расписанным в угол, так как я намерен написать свой код более гибким способом, как вы могли заметить. Таким образом, я все еще задаюсь вопросом об этом вопросе. В конце концов, оба пути эквивалентны, за исключением того, что если в один прекрасный день я захочу отделить запись от AD, я должен убрать инъекцию зависимостей, я думаю. Скажем, если я хочу управлять безопасностью для базовой базы данных. В противном случае, я вижу, что эта зависимая инъекция оправдана. Как вы думаете? –
Я не вижу никаких проблем, требующих объекта «Domain» в конструкторе ваших других классов; в то время как он тесно связан, если вы перейдете с LDAP, концепция «Группы безопасности» и «Организационного подразделения», скорее всего, исчезнет и будет заменена чем-то другим. – Nate
У них нет проблемы с созданием чего-то, что уже есть в .NET 3.5, но они не позволят вам использовать 3.5? Это не имеет никакого смысла. –