Альтернатива ProvidersHelper.InstantiateProviders

#.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 реализации.