- smartmassemail_src.zip
- SmartMassEmailSrc
- AssemblyInfo.cs
- bin
- EntLibHelper
- ImplementedProvidersDiagram.png
- ImplementedProvidersDiagram.psd
- Providers
- Configuration
- Providers.csproj
- Providers.csproj.user
- System
- Configuration
- Providers
- Providers
- EmailDeQueueProvider
- EmailDispatchProvider
- EmailQueueProvider
- EmailTemplateProvider
- ProcessFailureProvider
- Provider.cs
- References
- Microsoft.Practices.EnterpriseLibrary.Caching.Cryptography.dll
- Microsoft.Practices.EnterpriseLibrary.Caching.dll
- Microsoft.Practices.EnterpriseLibrary.Common.dll
- Microsoft.Practices.EnterpriseLibrary.Data.dll
- Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll
- Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll
- Microsoft.Practices.EnterpriseLibrary.Logging.Database.dll
- Microsoft.Practices.EnterpriseLibrary.Logging.dll
- Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll
- Microsoft.Practices.EnterpriseLibrary.Security.dll
- Microsoft.Practices.ObjectBuilder.dll
- nunit.framework.dll
- SmartMassEmailPropertySet.xml
- SmartMassEmail.Data.SqlClient
- SmartMassEmail.Data
- SmartMassEmail.Entities
- SmartMassEmail.ImplementedProviders
- SmartMassEmail.Sql2000.Service
- SmartMassEmail.Sql2005.Service
- SmartMassEmail.WebApplication.Sql2000
- SmartMassEmail.WebApplication.Sql2005
- SmartMassEmailSolution.gpState
- SmartMassEmailSolution.sln
- UpgradeLog.XML
- UpgradeLog2.XML
|
#region Using directives
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Configuration.Provider;
using System.Web.Configuration;
using System.Web;
using SmartMassEmail.Entities;
using SmartMassEmail.Data;
using SmartMassEmail.Data.Bases;
#endregion
namespace SmartMassEmail.Data
{
/// <summary>
/// This class represents the Data source repository and gives access to all the underlying providers.
/// </summary>
[CLSCompliant(true)]
public sealed class DataRepository
{
private static volatile NetTiersProvider _provider = null;
private static volatile NetTiersProviderCollection _providers = null;
private static volatile NetTiersServiceSection _section = null;
private static volatile Configuration _config = null;
private static object SyncRoot = new object();
/// <summary>
/// </summary>
public DataRepository()
{
}
private static void LoadProviders()
{
// Avoid claiming lock if providers are already loaded
if (_provider == null)
{
lock (SyncRoot)
{
// Do this again to make sure _provider is still null
if (_provider == null)
{
// Load registered providers and point _provider to the default provider
_providers = new NetTiersProviderCollection();
ProvidersHelper.InstantiateProviders(NetTiersSection.Providers, _providers, typeof(NetTiersProvider));
_provider = _providers[NetTiersSection.DefaultProvider];
if (_provider == null)
{
throw new ProviderException("Unable to load default NetTiersProvider");
}
}
}
}
}
/// <summary>
/// Gets the provider.
/// </summary>
/// <value>The provider.</value>
public static NetTiersProvider Provider
{
get { LoadProviders(); return _provider; }
}
/// <summary>
/// Gets the provider collection.
/// </summary>
/// <value>The providers.</value>
public static NetTiersProviderCollection Providers
{
get { LoadProviders(); return _providers; }
}
/// <summary>
/// Creates a new <c cref="TransactionManager"/> instance from the current datasource.
/// </summary>
/// <returns></returns>
public TransactionManager CreateTransaction()
{
return _provider.CreateTransaction();
}
#region Configuration
/// <summary>
/// Gets a reference to the configured NetTiersServiceSection object.
/// </summary>
public static NetTiersServiceSection NetTiersSection
{
get
{
// Try to get a reference to the default <netTiersService> section
_section = WebConfigurationManager.GetSection("netTiersService") as NetTiersServiceSection;
if ( _section == null )
{
// otherwise look for section based on the assembly name
_section = WebConfigurationManager.GetSection("SmartMassEmail.Data") as NetTiersServiceSection;
}
#region Design-Time Support
if ( _section == null )
{
// lastly, try to find the specific NetTiersServiceSection for this assembly
foreach ( ConfigurationSection temp in Configuration.Sections )
{
if ( temp is NetTiersServiceSection )
{
_section = temp as NetTiersServiceSection;
break;
}
}
}
#endregion Design-Time Support
if ( _section == null )
{
throw new ProviderException("Unable to load NetTiersServiceSection");
}
return _section;
}
}
#region Design-Time Support
/// <summary>
/// Gets a reference to the application configuration object.
/// </summary>
public static Configuration Configuration
{
get
{
if ( _config == null )
{
// load specific config file
if ( HttpContext.Current != null )
{
_config = WebConfigurationManager.OpenWebConfiguration("~");
}
else
{
String configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile.Replace(".config", "").Replace(".temp", "");
// check for design mode
if ( configFile.ToLower().Contains("devenv.exe") )
{
_config = GetDesignTimeConfig();
}
else
{
_config = ConfigurationManager.OpenExeConfiguration(configFile);
}
}
}
return _config;
}
}
private static Configuration GetDesignTimeConfig()
{
ExeConfigurationFileMap configMap = null;
Configuration config = null;
String path = null;
// Get an instance of the currently running Visual Studio IDE.
EnvDTE80.DTE2 dte = (EnvDTE80.DTE2) System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.8.0");
if ( dte != null )
{
dte.SuppressUI = true;
EnvDTE.ProjectItem item = dte.Solution.FindProjectItem("web.config");
if ( item != null )
{
System.IO.FileInfo info = new System.IO.FileInfo(item.ContainingProject.FullName);
path = String.Format("{0}\\{1}", info.Directory.FullName, item.Name);
configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = path;
}
/*
Array projects = (Array) dte2.ActiveSolutionProjects;
EnvDTE.Project project = (EnvDTE.Project) projects.GetValue(0);
System.IO.FileInfo info;
foreach ( EnvDTE.ProjectItem item in project.ProjectItems )
{
if ( String.Compare(item.Name, "web.config", true) == 0 )
{
info = new System.IO.FileInfo(project.FullName);
path = String.Format("{0}\\{1}", info.Directory.FullName, item.Name);
configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = path;
break;
}
}
*/
}
config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
return config;
}
#endregion Design-Time Support
#endregion Configuration
#region Connections
/// <summary>
/// Gets a reference to the ConnectionStringSettings collection.
/// </summary>
public static ConnectionStringSettingsCollection ConnectionStrings
{
get
{
// use default ConnectionStrings if _section has already been discovered
if ( _config == null && _section != null )
{
return WebConfigurationManager.ConnectionStrings;
}
return Configuration.ConnectionStrings.ConnectionStrings;
}
}
// dictionary of connection providers
private static Dictionary<String, ConnectionProvider> _connections;
/// <summary>
/// Gets the dictionary of connection providers.
/// </summary>
public static Dictionary<String, ConnectionProvider> Connections
{
get
{
if ( _connections == null )
{
lock (SyncRoot)
{
if (_connections == null)
{
_connections = new Dictionary<String, ConnectionProvider>();
// add a connection provider for each configured connection string
foreach ( ConnectionStringSettings conn in ConnectionStrings )
{
_connections.Add(conn.Name, new ConnectionProvider(conn.Name));
}
}
}
}
return _connections;
}
}
/// <summary>
/// Adds the specified connection string to the map of connection strings.
/// </summary>
/// <param name="connectionStringName">The connection string name.</param>
/// <param name="connectionString">The provider specific connection information.</param>
public static void AddConnection(String connectionStringName, String connectionString)
{
lock (SyncRoot)
{
Connections.Remove(connectionStringName);
ConnectionProvider connection = new ConnectionProvider(connectionStringName, connectionString);
Connections.Add(connectionStringName, connection);
}
}
/// <summary>
/// Provides ability to switch connection string at runtime.
/// </summary>
public sealed class ConnectionProvider
{
private NetTiersProvider _provider;
private NetTiersProviderCollection _providers;
private String _connectionStringName;
private String _connectionString;
/// <summary>
/// Initializes a new instance of the ConnectionProvider class.
/// </summary>
/// <param name="connectionStringName">The connection string name.</param>
public ConnectionProvider(String connectionStringName)
{
_connectionStringName = connectionStringName;
}
/// <summary>
/// Initializes a new instance of the ConnectionProvider class.
/// </summary>
/// <param name="connectionStringName">The connection string name.</param>
/// <param name="connectionString">The provider specific connection information.</param>
public ConnectionProvider(String connectionStringName, String connectionString)
{
_connectionString = connectionString;
_connectionStringName = connectionStringName;
}
/// <summary>
/// Gets the provider.
/// </summary>
public NetTiersProvider Provider
{
get { LoadProviders(); return _provider; }
}
/// <summary>
/// Gets the provider collection.
/// </summary>
public NetTiersProviderCollection Providers
{
get { LoadProviders(); return _providers; }
}
/// <summary>
/// Instantiates the configured providers based on the supplied connection string.
/// </summary>
private void LoadProviders()
{
DataRepository.LoadProviders();
// Avoid claiming lock if providers are already loaded
if ( _providers == null )
{
lock ( SyncRoot )
{
// Do this again to make sure _provider is still null
if ( _providers == null )
{
// apply connection information to each provider
for ( int i = 0; i < NetTiersSection.Providers.Count; i++ )
{
NetTiersSection.Providers[i].Parameters["connectionStringName"] = _connectionStringName;
// remove previous connection string, if any
NetTiersSection.Providers[i].Parameters.Remove("connectionString");
if ( !String.IsNullOrEmpty(_connectionString) )
{
NetTiersSection.Providers[i].Parameters["connectionString"] = _connectionString;
}
}
// Load registered providers and point _provider to the default provider
_providers = new NetTiersProviderCollection();
ProvidersHelper.InstantiateProviders(NetTiersSection.Providers, _providers, typeof(NetTiersProvider));
_provider = _providers[NetTiersSection.DefaultProvider];
}
}
}
}
}
#endregion Connections
#region Static properties
#region EmailMessageProvider
///<summary>
/// Gets the current instance of the Data Access Logic Component for the <see cref="EmailMessage"/> business entity.
/// It exposes CRUD methods as well as selecting on index, foreign keys and custom stored procedures.
///</summary>
public /*new*/ static EmailMessageProviderBase EmailMessageProvider
{
get
{
LoadProviders();
return _provider.EmailMessageProvider;
}
}
#endregion
#region EmailMessageDetailProvider
///<summary>
/// Gets the current instance of the Data Access Logic Component for the <see cref="EmailMessageDetail"/> business entity.
/// It exposes CRUD methods as well as selecting on index, foreign keys and custom stored procedures.
///</summary>
public /*new*/ static EmailMessageDetailProviderBase EmailMessageDetailProvider
{
get
{
LoadProviders();
return _provider.EmailMessageDetailProvider;
}
}
#endregion
#endregion
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here