Cosmos/Resources/Dependencies/DapperExtensions.StrongName/DapperExtensions.cs

255 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using DapperExtensions.Sql;
using DapperExtensions.Mapper;
using System.Data.Common;
namespace DapperExtensions
{
public static class DapperExtensions
{
private readonly static object _lock = new object();
private static Func<IDapperExtensionsConfiguration, IDapperImplementor> _instanceFactory;
private static IDapperImplementor _instance;
private static IDapperExtensionsConfiguration _configuration;
/// <summary>
/// Gets or sets the default class mapper to use when generating class maps. If not specified, AutoClassMapper<T> is used.
/// DapperExtensions.Configure(Type, IList<Assembly>, ISqlDialect) can be used instead to set all values at once
/// </summary>
public static Type DefaultMapper
{
get
{
return _configuration.DefaultMapper;
}
set
{
Configure(value, _configuration.MappingAssemblies, _configuration.Dialect);
}
}
/// <summary>
/// Gets or sets the type of sql to be generated.
/// DapperExtensions.Configure(Type, IList<Assembly>, ISqlDialect) can be used instead to set all values at once
/// </summary>
public static ISqlDialect SqlDialect
{
get
{
return _configuration.Dialect;
}
set
{
Configure(_configuration.DefaultMapper, _configuration.MappingAssemblies, value);
}
}
/// <summary>
/// Get or sets the Dapper Extensions Implementation Factory.
/// </summary>
public static Func<IDapperExtensionsConfiguration, IDapperImplementor> InstanceFactory
{
get
{
if (_instanceFactory == null)
{
_instanceFactory = config => new DapperImplementor(new SqlGeneratorImpl(config));
}
return _instanceFactory;
}
set
{
_instanceFactory = value;
Configure(_configuration.DefaultMapper, _configuration.MappingAssemblies, _configuration.Dialect);
}
}
/// <summary>
/// Gets the Dapper Extensions Implementation
/// </summary>
private static IDapperImplementor Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
{
_instance = InstanceFactory(_configuration);
}
}
}
return _instance;
}
}
static DapperExtensions()
{
Configure(typeof(AutoClassMapper<>), new List<Assembly>(), new SqlServerDialect());
}
/// <summary>
/// Add other assemblies that Dapper Extensions will search if a mapping is not found in the same assembly of the POCO.
/// </summary>
/// <param name="assemblies"></param>
public static void SetMappingAssemblies(IList<Assembly> assemblies)
{
Configure(_configuration.DefaultMapper, assemblies, _configuration.Dialect);
}
/// <summary>
/// Configure DapperExtensions extension methods.
/// </summary>
/// <param name="defaultMapper"></param>
/// <param name="mappingAssemblies"></param>
/// <param name="sqlDialect"></param>
public static void Configure(IDapperExtensionsConfiguration configuration)
{
_instance = null;
_configuration = configuration;
}
/// <summary>
/// Configure DapperExtensions extension methods.
/// </summary>
/// <param name="defaultMapper"></param>
/// <param name="mappingAssemblies"></param>
/// <param name="sqlDialect"></param>
public static void Configure(Type defaultMapper, IList<Assembly> mappingAssemblies, ISqlDialect sqlDialect)
{
Configure(new DapperExtensionsConfiguration(defaultMapper, mappingAssemblies, sqlDialect));
}
/// <summary>
/// Executes a query for the specified id, returning the data typed as per T
/// </summary>
public static T Get<T>(this DbConnection connection, dynamic id, DbTransaction transaction = null, int? commandTimeout = null) where T : class
{
var result = Instance.Get<T>(connection, id, transaction, commandTimeout);
return (T)result;
}
/// <summary>
/// Executes an insert query for the specified entity.
/// </summary>
public static void Insert<T>(this DbConnection connection, IEnumerable<T> entities, DbTransaction transaction = null, int? commandTimeout = null) where T : class
{
Instance.Insert<T>(connection, entities, transaction, commandTimeout);
}
/// <summary>
/// Executes an insert query for the specified entity, returning the primary key.
/// If the entity has a single key, just the value is returned.
/// If the entity has a composite key, an IDictionary&lt;string, object&gt; is returned with the key values.
/// The key value for the entity will also be updated if the KeyType is a Guid or Identity.
/// </summary>
public static dynamic Insert<T>(this DbConnection connection, T entity, DbTransaction transaction = null, int? commandTimeout = null) where T : class
{
return Instance.Insert<T>(connection, entity, transaction, commandTimeout);
}
/// <summary>
/// Executes an update query for the specified entity.
/// </summary>
public static bool Update<T>(this DbConnection connection, T entity, DbTransaction transaction = null, int? commandTimeout = null) where T : class
{
return Instance.Update<T>(connection, entity, transaction, commandTimeout);
}
/// <summary>
/// Executes a delete query for the specified entity.
/// </summary>
public static bool Delete<T>(this DbConnection connection, T entity, DbTransaction transaction = null, int? commandTimeout = null) where T : class
{
return Instance.Delete<T>(connection, entity, transaction, commandTimeout);
}
/// <summary>
/// Executes a delete query using the specified predicate.
/// </summary>
public static bool Delete<T>(this DbConnection connection, object predicate, DbTransaction transaction = null, int? commandTimeout = null) where T : class
{
return Instance.Delete<T>(connection, predicate, transaction, commandTimeout);
}
/// <summary>
/// Executes a select query using the specified predicate, returning an IEnumerable data typed as per T.
/// </summary>
public static IEnumerable<T> GetList<T>(this DbConnection connection, object predicate = null, IList<ISort> sort = null, DbTransaction transaction = null, int? commandTimeout = null, bool buffered = false) where T : class
{
return Instance.GetList<T>(connection, predicate, sort, transaction, commandTimeout, buffered);
}
/// <summary>
/// Executes a select query using the specified predicate, returning an IEnumerable data typed as per T.
/// Data returned is dependent upon the specified page and resultsPerPage.
/// </summary>
public static IEnumerable<T> GetPage<T>(this DbConnection connection, object predicate, IList<ISort> sort, int page, int resultsPerPage, DbTransaction transaction = null, int? commandTimeout = null, bool buffered = false) where T : class
{
return Instance.GetPage<T>(connection, predicate, sort, page, resultsPerPage, transaction, commandTimeout, buffered);
}
/// <summary>
/// Executes a select query using the specified predicate, returning an IEnumerable data typed as per T.
/// Data returned is dependent upon the specified firstResult and maxResults.
/// </summary>
public static IEnumerable<T> GetSet<T>(this DbConnection connection, object predicate, IList<ISort> sort, int firstResult, int maxResults, DbTransaction transaction = null, int? commandTimeout = null, bool buffered = false) where T : class
{
return Instance.GetSet<T>(connection, predicate, sort, firstResult, maxResults, transaction, commandTimeout, buffered);
}
/// <summary>
/// Executes a query using the specified predicate, returning an integer that represents the number of rows that match the query.
/// </summary>
public static int Count<T>(this DbConnection connection, object predicate, DbTransaction transaction = null, int? commandTimeout = null) where T : class
{
return Instance.Count<T>(connection, predicate, transaction, commandTimeout);
}
/// <summary>
/// Executes a select query for multiple objects, returning IMultipleResultReader for each predicate.
/// </summary>
public static IMultipleResultReader GetMultiple(this DbConnection connection, GetMultiplePredicate predicate, DbTransaction transaction = null, int? commandTimeout = null)
{
return Instance.GetMultiple(connection, predicate, transaction, commandTimeout);
}
/// <summary>
/// Gets the appropriate mapper for the specified type T.
/// If the mapper for the type is not yet created, a new mapper is generated from the mapper type specifed by DefaultMapper.
/// </summary>
public static IClassMapper GetMap<T>() where T : class
{
return Instance.SqlGenerator.Configuration.GetMap<T>();
}
/// <summary>
/// Clears the ClassMappers for each type.
/// </summary>
public static void ClearCache()
{
Instance.SqlGenerator.Configuration.ClearCache();
}
/// <summary>
/// Generates a COMB Guid which solves the fragmented index issue.
/// See: http://davybrion.com/blog/2009/05/using-the-guidcomb-identifier-strategy
/// </summary>
public static Guid GetNextGuid()
{
return Instance.SqlGenerator.Configuration.GetNextGuid();
}
}
}