Решение, опубликованное выше, наследуется от LdapConnection. Это хорошо, если вы хотите сохранить цепочку наследования, но я не думаю, что это необходимо в вашем случае. Вы просто хотите настроить и упростить интерфейс.
Шаблон проектирования прокси наследует от базового объекта, так что прокси-объект может использоваться везде, где требуется базовый объект, это хорошо, если вы хотите «внедрить» дополнительные функциональные возможности в класс без реализации клиентами этого класса , Я не думаю, что это ваше намерение здесь?
Большая проблема с решением, опубликованным выше, заключается в том, что (поскольку он наследуется непосредственно от LdapConnection), вы можете вызвать поиск двумя способами, например:
Settings settings = new Settings();
AD myAD = new AD(settings);
object results = myAD.Users.Search();
// OR
object results2 = myAD.Search();
Как я уверен, вы можете видеть из кода, оба они вызывают один и тот же базовый метод. Но, на мой взгляд, это еще больше сбивает с толку разработчиков, чем просто использование ванильного объекта LdapConnection. Я всегда думал: «В чем разница между этими, казалось бы, одинаковыми методами?» Еще хуже, если вы добавите некоторый пользовательский код в метод поиска UsersWrapper, вы не всегда сможете гарантировать, что он будет вызван. У разработчика всегда будет возможность вызывать Поиск напрямую, не обращаясь к UsersWrapper.
Фаулер в своей книге PoEAA определяет паттерн, называемый шлюзом. Это способ упростить и настроить интерфейс для внешней системы или библиотеки.
public class AD
{
private LdapConnection ldapConn;
private UsersWrapper users;
public AD()
{
this.ldapConn = new LdapConnection(new Settings(/* configure settings here*/));
this.users = new UsersWrapper(this.ldapConn);
}
public UsersWrapper Users
{
get
{
return this.users;
}
}
public class UsersWrapper
{
private LdapConnection ldapConn;
public UsersWrapper(LdapConnection ldapConn)
{
this.ldapConn = ldapConn;
}
public object Search()
{
return this.ldapConn.Search();
}
public void Add(object something)
{
this.ldapConn.Add(something);
}
public void Delete(object something)
{
this.ldapConn.Delete(something);
}
}
}
Затем это можно использовать так:
AD myAD = new AD();
object results = myAD.Users.Search();
Здесь вы можете видеть, что объект LdapConnection полностью инкапсулирован внутри класса, и существует только один способ вызова каждого метода. Более того, настройка LdapConnection также полностью инкапсулирована. Код, использующий этот класс, не должен беспокоиться о том, как его настроить. Настройки определяются только в одном месте (в этом классе, а не распространяются по всему приложению).
Единственным недостатком является то, что вы теряете цепочку наследования обратно в LdapConnection, но я не думаю, что это необходимо в вашем случае.