// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-using System;
-using System.Configuration;
-
#if NET_2_0
+using System;
+using System.Collections;
+using System.Configuration;
using System.Configuration.Provider;
+using System.Data.Common;
+using System.Data.SqlClient;
+using System.IO;
+using System.Reflection;
+using System.Web;
+using System.Web.Compilation;
+using System.Collections.Specialized;
namespace System.Web.Configuration {
public static class ProvidersHelper
{
- [MonoTODO ("is this right?")]
public static ProviderBase InstantiateProvider (ProviderSettings providerSettings, Type providerType)
{
- ProviderBase provider = Activator.CreateInstance (providerType) as ProviderBase;
+ Type settingsType = HttpApplication.LoadType (providerSettings.Type);
+
+ if (settingsType == null)
+ settingsType = HttpApplication.LoadTypeFromBin (providerSettings.Type);
+
+ // check App_Code dlls
+ if (settingsType == null) {
+ IList appCode = BuildManager.CodeAssemblies;
+
+ if (appCode != null && appCode.Count > 0) {
+ Assembly asm;
+ foreach (object o in appCode) {
+ asm = o as Assembly;
+ if (asm == null)
+ continue;
+ settingsType = asm.GetType (providerSettings.Type);
+ if (settingsType != null)
+ break;
+ }
+ }
+ }
+
+ if (settingsType == null)
+ throw new ConfigurationErrorsException (String.Format ("Could not find type: {0}",
+ providerSettings.Type));
+ if (!providerType.IsAssignableFrom (settingsType))
+ throw new ConfigurationErrorsException (String.Format ("Provider '{0}' must subclass from '{1}'",
+ providerSettings.Name, providerType));
- provider.Initialize (providerSettings.Name, providerSettings.Parameters);
+ ProviderBase provider = Activator.CreateInstance (settingsType) as ProviderBase;
+
+ NameValueCollection col = new NameValueCollection (providerSettings.Parameters);
+ provider.Initialize (providerSettings.Name, col);
return provider;
}
- [MonoTODO ("is this right?")]
public static void InstantiateProviders (ProviderSettingsCollection configProviders, ProviderCollection providers, Type providerType)
{
+ if (!typeof (ProviderBase).IsAssignableFrom (providerType))
+ throw new ConfigurationErrorsException (String.Format ("type '{0}' must subclass from ProviderBase", providerType));
+
foreach (ProviderSettings settings in configProviders)
providers.Add (InstantiateProvider (settings, providerType));
}
+
+ internal static DbProviderFactory GetDbProviderFactory (string providerName)
+ {
+ DbProviderFactory f = null;
+
+ if (providerName != null && providerName != "") {
+ try {
+ f = DbProviderFactories.GetFactory(providerName);
+ }
+ catch (Exception e) { Console.WriteLine (e); /* nada */ }
+ if (f != null)
+ return f;
+ }
+
+ return SqlClientFactory.Instance;
+ }
}
}