Business Logic Toolkit for .NET
www.bltoolkit.net
|  Home   |  Download   |  Documentation   |  Discussions   |  License   |

  Source.DataAccess.DataAccessorBase.cs

 
using System;
using System.Collections;
using System.Data;

using BLToolkit.Aspects;
using BLToolkit.Data;
using BLToolkit.Mapping;
using BLToolkit.Properties;
using BLToolkit.Reflection.Extension;

namespace BLToolkit.DataAccess
{
    public abstract class DataAccessorBase
    {
        #region Constructors

        [System.Diagnostics.DebuggerStepThrough]
        protected DataAccessorBase()
        {
        }

        [System.Diagnostics.DebuggerStepThrough]
        protected DataAccessorBase(DbManager dbManager)
        {
            SetDbManager(dbManager, false);
        }

        [System.Diagnostics.DebuggerStepThrough]
        protected DataAccessorBase(DbManager dbManager, bool dispose)
        {
            SetDbManager(dbManager, dispose);
        }

        #endregion

        #region Public Members

        [NoInterception, System.Diagnostics.DebuggerStepThrough]
        public virtual DbManager GetDbManager()
        {
            return _dbManager ?? CreateDbManager();
        }

        [NoInterception]
        protected virtual DbManager CreateDbManager()
        {
            return new DbManager();
        }

        [NoInterception]
        public virtual void BeginTransaction()
        {
            if (_dbManager == null)
                throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);

            _dbManager.BeginTransaction();
        }

        [NoInterception]
        public virtual void BeginTransaction(IsolationLevel il)
        {
            if (_dbManager == null)
                throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);

            _dbManager.BeginTransaction(il);
        }

        [NoInterception]
        public virtual void CommitTransaction()
        {
            if (_dbManager == null)
                throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);

            _dbManager.CommitTransaction();
        }

        [NoInterception]
        public virtual void RollbackTransaction()
        {
            if (_dbManager == null)
                throw new InvalidOperationException(Resources.DataAccessorBase_NoDbManager);

            _dbManager.RollbackTransaction();
        }

        private ExtensionList _extensions;
        public  ExtensionList  Extensions
        {
            get { return _extensions ?? (_extensions = MappingSchema.Extensions); }
            set { _extensions = value; }
        }

        private        bool _disposeDbManager = true;
        [NoInterception]
        public virtual bool  DisposeDbManager
        {
            get { return _disposeDbManager;  }
            set { _disposeDbManager = value; }
        }

        private MappingSchema _mappingSchema;
        public  MappingSchema  MappingSchema
        {
            get { return _mappingSchema ?? (_mappingSchema = _dbManager != null? _dbManager.MappingSchema: Map.DefaultSchema); }
            set { _mappingSchema = value; }
        }

        #endregion

        #region Protected Members

        private   DbManager _dbManager;
        protected DbManager  DbManager
        {
            get { return _dbManager; }
        }

        protected internal void SetDbManager(DbManager dbManager, bool dispose)
        {
            _dbManager        = dbManager;
            _disposeDbManager = dispose;
        }

        [NoInterception]
        protected virtual string GetDefaultSpName(string typeName, string actionName)
        {
            return typeName == null?
                actionName:
                string.Format("{0}_{1}", typeName, actionName);
        }

        private static readonly Hashtable _actionSproc = new Hashtable();

        [NoInterception]
        protected virtual string GetSpName(Type type, string actionName)
        {
            if (type == null)
                return GetDefaultSpName(null, actionName);

            string key       = type.FullName + "$" + actionName;
            string sprocName = (string)_actionSproc[key];

            if (sprocName == null)
            {
                object[] attrs = type.GetCustomAttributes(typeof(ActionSprocNameAttribute), true);

                foreach (ActionSprocNameAttribute attr in attrs)
                {
                    if (attr.ActionName == actionName)
                    {
                        sprocName = attr.ProcedureName;
                        break;
                    }
                }

                if (sprocName == null)
                    sprocName = GetDefaultSpName(GetTableName(type), actionName);

                _actionSproc[key] = sprocName;
            }

            return sprocName;
        }

        [NoInterception]
        protected virtual string GetDatabaseName(Type type)
        {
            bool isSet;
            return MappingSchema.MetadataProvider.GetDatabaseName(type, Extensions, out isSet);
        }

        [NoInterception]
        protected virtual string GetOwnerName(Type type)
        {
            bool isSet;
            return MappingSchema.MetadataProvider.GetOwnerName(type, Extensions, out isSet);
        }

        [NoInterception]
        protected virtual string GetTableName(Type type)
        {
            bool isSet;
            return MappingSchema.MetadataProvider.GetTableName(type, Extensions, out isSet);
        }

        [NoInterception]
        protected virtual void Dispose(DbManager dbManager)
        {
            if (dbManager != null && DisposeDbManager)
                dbManager.Dispose();
        }

        #endregion
    }
}
 
© 2010 www.bltoolkit.net
support@bltoolkit.net