Шаблон поставщика и DefaultProvider
Я пытаюсь реализовать шаблон провайдера в пользовательском веб-элементе управления. Я все еще пытаюсь понять шаблон, и у меня есть следующие вопросы.
Является ли поставщик по умолчанию поставщиком, который всегда будет использоваться при загрузке моего элемента управления? Из того, что я могу сказать, используемый провайдер всегда будет по умолчанию, но я не уверен, потому что в документации MSDN сказано, что серверные элементы управления, которые позволяют выбирать провайдеров, должны иметь свойство Provider, значение которого по умолчанию равно значению defaultProvider. Для меня это означает, что элемент управления может загружать данного поставщика на основе его свойства Provider, если этот поставщик находится в файле конфигурации. Это верно? Поэтому поставщик по умолчанию возвращается, если не запрашивается конкретный поставщик.
Чтобы сменить провайдера, нужно ли просто изменить провайдера по умолчанию в моем конфигурационном файле? <- Я думаю, что это неправильно, так как это просто изменит возвращенный defaultProvider.
Правильно ли это: в элементе управления по умолчанию поставщик будет загружен в метод события OnLoad элемента управления? Мне нужно передать контрольные данные из разных источников в зависимости от провайдера, но полученные данные затем будут помещены в класс. что элемент управления будет использовать для визуализации себя.
Я также запутался, как получить данные для элемента управления со страницы? Скажем, у моего ProviderBase был метод с именем LoadData
Затем в моем SQLCustomerProvider я реализую метод LoadData, можно ли здесь настроить этот код для чтения моих конкретных данных и загрузки в класс, или страница, использующая элемент управления, загружает данные в класс?
Спасибо!
1 ответ
Я сразу признаю, что мои знания провайдеров ограничены написанием их для членства / профиля / ролей, но общие вещи все же должны применяться:
Если вы не дадите разработчику возможность указать другого поставщика, то да, будет использоваться поставщик по умолчанию.
Итак, возьмем аутентификацию в качестве примера, если в вашем файле web.config было следующее:
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20">
<providers>
<remove name="AspNetSqlProvider" />
<add name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlServices"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
passwordFormat="Hashed"
applicationName="/" />
<add name="AdProvider"
type="System.Web.Security.ActiveDirectoryMembershipProvider" />
</providers>
</membership>
Когда вы добавляете элемент управления Login где-то на странице, он будет использовать SqlProvider.
Вы можете использовать другого поставщика одним из двух способов:
- Вы можете указать другого поставщика, используя свойство MembershipProvider элемента управления Login
- Вы можете указать метод, который будет вызываться в событии Authenticate элементов управления Login, где вы можете выбрать своего провайдера.
Пример метода 2:
private void OnAuthenticate(object sender, AuthenticateEventArgs e){
bool authenticated = false;
MembershipProvider sqlProvider = Membership.Providers["SqlProvider"];
authenticated = sqlProvider.ValidateUser(Login1.UserName, Login1.Password);
if (!authenticated){
// User not found in database, try Active Directory:
MembershipProvider adProvider = Membership.Providers["AdProvider"];
authenticated = adProvider.ValidateUser(Login1.UserName, Login1.Password);
}
e.Authenticated = authenticated;
}
Другими способами, которыми вы могли бы сделать это на своем собственном элементе управления, является предоставление свойства Provider и проверка, имеет ли оно значение, и использование этого поставщика вместо defaultProvider.
Как правило, модель провайдера используется для предоставления набора поведения по умолчанию известному классу - поэтому у всех провайдеров членства есть (например) метод GetUser, который возвращает MemberhipUser - вся цель реализации GetUser в AspNetSqlMembershipProvider - загрузить данные MembershipUser из базы данных SQL ASP.NET - вы можете увидеть это в действии в образце поставщика членства
Надеюсь, это поможет!