#.net #provider
#.net #поставщик услуг
Вопрос:
Я применяю модель поставщика для некоторых частей моего приложения. И я не хочу добавлять Систему.Веб-сборка в мою библиотеку классов. Есть ли какой-нибудь способ создать экземпляр provider без использования ProvidersHelper.InstantiateProviders (System.Web.Configuration) Экземпляры (System.Web.Configuration) Большое вам спасибо!
Комментарии:
1. @Inuyasha: Да, это так.
2. Вы не можете использовать что-то из System. Веб без добавления системы. Веб-сборка.
Ответ №1:
этот вопрос действительно старый, но я подумал, что поделюсь своим опытом с этим же вопросом для всех будущих искателей этого вопроса. вы могли бы довольно легко реализовать свой собственный, есть несколько причудливых автоматических типов, разрешающих проблемы, которые решает система.веб-версия использует с внутренними HTTP-помощниками, но они вам, вероятно, не нужны, если вам не нужны другие аспекты System.Web.dll
примерный пример:
public static void InstantiateProviders(ProviderSettingsCollection configProviders,
ProviderCollection providers, Type providerType)
{
foreach (ProviderSettings providerSettings in configProviders)
providers.Add(InstantiateProvider(providerSettings, providerType));
}
Метод InstantiateProviderMethod:
public static ProviderBase InstantiateProvider(ProviderSettings providerSettings, Type providerType)
{
ProviderBase providerBase;
try
{
string typeName = providerSettings.Type == null ? null : providerSettings.Type.Trim();
if (string.IsNullOrEmpty(typeName))
throw new ArgumentException("Provider has not type name.");
Type type = GetType(typeName, "type", providerSettings, null, true);
if (type.ContainsGenericParameters)
{ //if it is generic, we need to make sure the generic types get populated before checking inheritance and invokation
var genericTypes = providerType.GenericTypeArguments;
type = type.MakeGenericType(genericTypes);
}
if (!providerType.IsAssignableFrom(type))
{
throw new ArgumentException("provider must implement from type", providerType.ToString());
}
else
{
providerBase = (ProviderBase)Activator.CreateInstance(type);
NameValueCollection parameters = providerSettings.Parameters;
NameValueCollection config = new NameValueCollection(parameters.Count, StringComparer.Ordinal);
foreach (string index in parameters)
config[index] = parameters[index];
providerBase.Initialize(providerSettings.Name, config);
}
}
catch (exc)...
return providerBase;
}
GetType
метод там действительно просто анализирует тип и получает его (плюс некоторая обработка ошибок) — но это действительно все, что вам нужно сделать. а затем вызовите его в своем Initialize(string name NameValueCollection config)
методе в вашей ProviderBase
реализации.