Какой из них является лучшим подходом архитектуры / дизайна? - PullRequest
2 голосов
/ 12 ноября 2010

Цель
Написать эффективную библиотеку 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);
    }
}

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

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

1 Ответ

2 голосов
/ 12 ноября 2010

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

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

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

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

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