2010-11-12 2 views
2

Цель
Чтобы написать юбилеи, библиотеку Active Directory, чтобы облегчить работу технички, которые отвечают создавать модели доступа в Active Directory контроллера домена. Эта библиотека должна позволять следующие:Какой из них - лучший подход к архитектуре/дизайну?

  1. Основные операции: Добавить, Изменить, Удалить, записи списка;
  2. Запись может быть как организационным подразделением, группой или пользователем (на данный момент больше не требуется);

Я думал о наличии класса, который будет представлять собой домен, с которым мы хотим работать.

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 интерфейса.

Вопросы

  1. Это хорошая практика, если я не хочу, чтобы пользователь изменить Domain свойство любых IDirectoryEntry экземпляров?

  2. Было бы предпочтительнее просто оставить эту строку Domain.Entries.Add() уйти и иметь метод в моем классе Domain, который добавит запись в домен?

Пример кода для вопроса # 2

public class Domain { 
    //See above for other members. 
    public void AddEntry<T>(T entry) { 
     Entries.Add(entry.Name, entry); 
    } 
} 

  • Что, по вашему мнению, лучшая архитектура в этой ситуации?

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

ответ

2

Вы посмотрели на пространство имен .NET.DirectoryServices.AccountManagement .NET 3.5/4? Он обеспечивает большую часть функциональности, требуемой для более унифицированного и .NET-интерфейса. Я лично написал библиотеку с аналогичными требованиями к вашей, используя комбинацию того и другого.

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

В частности, на вопрос 1, я думаю, что это сработает; однако любой, кто ссылается на экземпляр Domain, может удалить любую данную запись.

К вопросу 2, это очень вероятно, как я буду реализовывать его сам, если у меня не было убедительной причины не делать этого.

+0

Спасибо Нейт. К сожалению, мой клиент запрещает мне использовать .NET 2.0, иначе я бы использовал 3.5. Кроме того, я не боюсь быть расписанным в угол, так как я намерен написать свой код более гибким способом, как вы могли заметить. Таким образом, я все еще задаюсь вопросом об этом вопросе. В конце концов, оба пути эквивалентны, за исключением того, что если в один прекрасный день я захочу отделить запись от AD, я должен убрать инъекцию зависимостей, я думаю. Скажем, если я хочу управлять безопасностью для базовой базы данных. В противном случае, я вижу, что эта зависимая инъекция оправдана. Как вы думаете? –

+0

Я не вижу никаких проблем, требующих объекта «Domain» в конструкторе ваших других классов; в то время как он тесно связан, если вы перейдете с LDAP, концепция «Группы безопасности» и «Организационного подразделения», скорее всего, исчезнет и будет заменена чем-то другим. – Nate

+0

У них нет проблемы с созданием чего-то, что уже есть в .NET 3.5, но они не позволят вам использовать 3.5? Это не имеет никакого смысла. –

Смежные вопросы