Пример #1
0
        public bool OnRemoveAfter <T>(IEntityRequestContext context, T entity) where T : class, IEntityIdentity
        {
            var info = EntityInfoManager.GetInfo(entity);

            AuditManager.LogRemove(context.Who, IdentityManager.GetClientMachine(context.Who), info.Module, entity._key, null, null, entity, context.TransactionUID);
            return(true);
        }
        public virtual T Get(IEntityRequestContext context, string key)
        {
            var entity = _container.GetInstance <T>();

            entity._key = key;
            return(Get(context, entity));
        }
Пример #3
0
        public bool OnModifyAfter <T>(IEntityRequestContext context, T before, T after) where T : class, IEntityIdentity
        {
            var info = EntityInfoManager.GetInfo(before);

            AuditManager.LogModify(context.Who, IdentityManager.GetClientMachine(context.Who), info.Module, before._key, null, null, before, after, context.TransactionUID);
            return(true);
        }
        public virtual T Get(IEntityRequestContext context, IEntityIdentity entity)
        {
            using (Logger.CreateTrace(LoggingBoundaries.ServiceBoundary, typeof(EntityBusinessFacade <T>), "Get"))
            {
                try
                {
                    if (!context.IgnoreHandlers.HasFlag(EntityEventType.GetBefore) && !_handlers.OnGetBefore(context, entity))
                    {
                        return(null);
                    }

                    var item = _repository.Get(context, entity as T);

                    if (!context.IgnoreHandlers.HasFlag(EntityEventType.GetAfter) && !_handlers.OnGetAfter(context, item))
                    {
                        return(null);
                    }

                    return(item);
                }
                catch (Exception ex)
                {
                    if (Logger.HandleException(LoggingBoundaries.ServiceBoundary, ex))
                    {
                        throw;
                    }
                }
            }

            return(null);
        }
Пример #5
0
        public T Get(IEntityRequestContext context, T entity)
        {
            using (var database = SqlQuery.GetConnection(_info.Module, EntityOperationType.Get, null, null, context))
            {
                Debug.Assert(database != null);

                return(SqlQuery.Get <T>(_container, context, EntityInfoManager.GetInfo(entity), entity._key, database));
            }
        }
        public virtual void Save(IEntityRequestContext context, IEntityIdentity entity)
        {
            using (Logger.CreateTrace(LoggingBoundaries.ServiceBoundary, typeof(EntityBusinessFacade <T>), "Save"))
            {
                var first = context.Operations.Count == 0;

                try
                {
                    var before = _repository.Get(context, entity as T);

                    if (before == null)
                    {
                        if (!context.IgnoreHandlers.HasFlag(EntityEventType.AddBefore) && !_handlers.OnAddBefore(context, entity))
                        {
                            throw new Exception("OnAddBefore handler rejected");
                        }

                        _repository.Add(context, entity as T);

                        if (!context.IgnoreHandlers.HasFlag(EntityEventType.AddAfter) && !_handlers.OnAddAfter(context, entity))
                        {
                            throw new Exception("OnAddAfter handler rejected");
                        }
                    }
                    else
                    {
                        if (!context.IgnoreHandlers.HasFlag(EntityEventType.ModifyBefore) && !_handlers.OnModifyBefore(context, before, entity))
                        {
                            throw new Exception("OnModifyBefore handler rejected");
                        }

                        _repository.Modify(context, before, entity as T);

                        if (!context.IgnoreHandlers.HasFlag(EntityEventType.ModifyAfter) && !_handlers.OnModifyAfter(context, before, entity))
                        {
                            throw new Exception("OnModifyAfter handler rejected");
                        }
                    }
                }
                catch (Exception ex)
                {
                    context.Rollback();
                    if (Logger.HandleException(LoggingBoundaries.ServiceBoundary, ex))
                    {
                        throw;
                    }
                }
                finally
                {
                    if (first)
                    {
                        context.Commit();
                    }
                }
            }
        }
        public bool OnRemoveBefore <T>(IEntityRequestContext context, T entity) where T : class, IEntityIdentity
        {
            var info = EntityInfoManager.GetInfo(entity);

            if (!AuthorizationHelper.CanRemove(context.Who, info))
            {
                AuditManager.LogAccess(context.Who, IdentityManager.GetClientMachine(context.Who), info.Module, entity._key, null, null, entity, context.TransactionUID);
                throw new UnauthorizedAccessException();
            }
            return(true);
        }
        public bool OnGetPagedBefore <T>(IEntityRequestContext context) where T : class, IEntityIdentity
        {
            var info = EntityInfoManager.GetInfo(typeof(T));

            if (!AuthorizationHelper.CanView(context.Who, info))
            {
                AuditManager.LogChange <T>(context.Who, info.Module, info.Entity, null, null, null, "ACC", null, null, context.TransactionUID);
                throw new UnauthorizedAccessException();
            }
            return(true);
        }
Пример #9
0
        public void Remove(IEntityRequestContext context, T entity)
        {
            using (var database = SqlQuery.GetConnection(_info.Module, EntityOperationType.Remove, entity, null, context))
            {
                Debug.Assert(database != null);

                using (var command = database.CreateStoredProcCommand(_info.Module, $"usp_{_info.Entity}Remove"))
                {
                    BuildCommand(context, entity, command, false);
                    command.ExecuteNonQuery();
                }
            }
        }
Пример #10
0
        public void Modify(IEntityRequestContext context, T before, T after)
        {
            using (var database =
                       SqlQuery.GetConnection(_info.Module, EntityOperationType.Modify, before, after, context))
            {
                Debug.Assert(database != null);

                using (var command = database.CreateStoredProcCommand(_info.Module, $"usp_{_info.Entity}Modify"))
                {
                    BuildCommand(context, after, command, false);
                    command.ExecuteNonQuery();
                }
            }
        }
Пример #11
0
        public IEnumerable <T> GetPaged(IEntityRequestContext context, int skip, ref int count, bool retCount, string filterBy, string orderBy)
        {
            using (var database = SqlQuery.GetConnection(_info.Module, EntityOperationType.Get, null, null, context))
            {
                Debug.Assert(database != null);

                var list = new List <T>();

                var entityList = SqlQuery.GetPaged <T>(_container, context, _info, skip, ref count, retCount, filterBy, orderBy, database);
                foreach (var entity in entityList)
                {
                    list.Add(entity);
                }

                return(list);
            }
        }
        public bool OnModifyBefore <T>(IEntityRequestContext context, T before, T after) where T : class, IEntityIdentity
        {
            var retValue = true;

            var info        = EntityInfoManager.GetInfo(before);
            var handlers    = _producers[EntityEventType.ModifyBefore];
            var allTypes    = handlers.ContainsKey(ALL_CLASSES);
            var targetTypes = handlers.ContainsKey(info.Name);

            if (!allTypes && !targetTypes)
            {
                return(true);
            }

            if (allTypes)
            {
                foreach (var handler in handlers[ALL_CLASSES])
                {
                    if (!handler.OnModifyBefore(context, before, after))
                    {
                        retValue = false;
                    }
                }
            }

            if (targetTypes)
            {
                foreach (var handler in handlers[info.Name])
                {
                    if (!handler.OnModifyBefore(context, before, after))
                    {
                        retValue = false;
                    }
                }
            }


            return(retValue);
        }
        public IEnumerable <T> OnGetPagedAfter <T>(IEntityRequestContext context, IEnumerable <T> list) where T : class, IEntityIdentity
        {
            var info        = EntityInfoManager.GetInfo(typeof(T));
            var handlers    = _producers[EntityEventType.GetPagedAfter];
            var allTypes    = handlers.ContainsKey(ALL_CLASSES);
            var targetTypes = handlers.ContainsKey(info.Name);

            if (!allTypes && !targetTypes)
            {
                return(list);
            }

            if (targetTypes)
            {
                foreach (var handler in handlers[info.Name])
                {
                    list = handler.OnGetPagedAfter(context, list);
                    if (list == null)
                    {
                        return(null);
                    }
                }
            }

            if (allTypes)
            {
                foreach (var handler in handlers[ALL_CLASSES])
                {
                    list = handler.OnGetPagedAfter(context, list);
                    if (list == null)
                    {
                        return(null);
                    }
                }
            }
            return(list);
        }
Пример #14
0
        public void BuildCommand(IEntityRequestContext context, T entity, IDbCommand command, bool addRecord)
        {
            Debug.Assert(command != null);

            var properties = _info.Properties;

            //EntityInfoManager.Map<T>(_info);

            foreach (var property in properties)
            {
                var prop  = property.Value;
                var value = prop.Get.DynamicInvoke(entity);
                if (value == null)
                {
                    continue;
                }

                if (prop.Type == "json")
                {
                    value = JsonConvert.SerializeObject(value);
                }

                if (value is DateTime)
                {
                    value = (value as DateTime?).ToDB();
                }

                if (addRecord && prop.IsIdentity.HasValue && prop.IsIdentity.Value)
                {
                    command.AddParameter("@" + prop.Name, ParameterDirection.InputOutput, value);
                }
                else
                {
                    command.AddInParameter("@" + prop.Name, value);
                }
            }
        }
        public virtual IEnumerable <T> GetPaged(IEntityRequestContext context, int skip, ref int count, bool retCount, string filterBy, string orderBy)
        {
            using (Logger.CreateTrace(LoggingBoundaries.ServiceBoundary, typeof(EntityBusinessFacade <T>), "GetPaged"))
            {
                try
                {
                    if (count < 0)
                    {
                        count = 5000;
                    }

                    if (!context.IgnoreHandlers.HasFlag(EntityEventType.GetPagedBefore) && !_handlers.OnGetPagedBefore <T>(context))
                    {
                        return(null);
                    }

                    var list = _repository.GetPaged(context, skip, ref count, retCount, filterBy, orderBy);

                    if (!context.IgnoreHandlers.HasFlag(EntityEventType.GetPagedAfter))
                    {
                        list = _handlers.OnGetPagedAfter(context, list);
                    }

                    return(list);
                }
                catch (Exception ex)
                {
                    if (Logger.HandleException(LoggingBoundaries.ServiceBoundary, ex))
                    {
                        throw;
                    }
                }
            }

            return(null);
        }
Пример #16
0
 public bool OnGetPagedBefore <T>(IEntityRequestContext context) where T : class, IEntityIdentity
 {
     throw new NotImplementedException();
 }
Пример #17
0
 public bool OnModifyAfter <T>(IEntityRequestContext context, T before, T after) where T : class, IEntityIdentity
 {
     throw new NotImplementedException();
 }
Пример #18
0
 public bool OnGetAfter <T>(IEntityRequestContext context, T entity) where T : class, IEntityIdentity
 {
     throw new NotImplementedException();
 }
Пример #19
0
 public bool OnModifyBefore <T>(IEntityRequestContext context, T before, T after) where T : class, IEntityIdentity
 {
     throw new UnauthorizedAccessException();
 }
Пример #20
0
        public static T Get <T>(Container container, IEntityRequestContext context, IEntityInfo info, string primaryKey, IDBConnection database) where T : class, IEntityIdentity
        {
            using (Logger.CreateTrace(LoggingBoundaries.ServiceBoundary, typeof(SqlQuery), "Get"))
            {
                try
                {
                    var view = $"[{info.Module}].[VW_{info.Entity.ToUpperInvariant()}]";

                    var keyValues = primaryKey.Split('|').ToList();

                    var keys       = new List <string>();
                    var parameters = new List <DbParameter>();
                    var idx        = 0;
                    foreach (var property in info.Properties)
                    {
                        idx++;
                        var val = property.Value;
                        if (!val.IsKey.HasValue || (val.IsKey.HasValue && !val.IsKey.Value))
                        {
                            continue;
                        }

                        keys.Add($"{property.Key} = @val{idx}");
                        parameters.Add(database.CreateParameter($"@val{idx}", keyValues[0]));
                    }

                    var where = string.Join(" AND ", keys);

                    using (database)
                    {
                        var command = database.CreateCommand($"SELECT * FROM {view} WHERE {where}", CommandType.Text);
                        foreach (var parameter in parameters)
                        {
                            command.AddParameter(parameter);
                        }

                        var entity = new Entity();

                        var factory = container.GetInstance <IEntityCreateFactory>();
                        T   item    = factory.CreateNew(info) as T;

                        command.ExecuteReader(dataReader =>
                        {
                            if (!PopulateEntity(item, info, dataReader, true))
                            {
                                item = null;
                            }
                        });

                        return(item);
                    }
                }
                catch (Exception ex)
                {
                    if (Logger.HandleException(LoggingBoundaries.ServiceBoundary, ex))
                    {
                        throw;
                    }
                }
            }

            return(null);
        }
Пример #21
0
 public bool OnRemoveBefore <T>(IEntityRequestContext context, T entity) where T : class, IEntityIdentity
 {
     throw new NotImplementedException();
 }
Пример #22
0
 public IEnumerable <T> OnGetPagedAfter <T>(IEntityRequestContext context, IEnumerable <T> list) where T : class, IEntityIdentity
 {
     throw new NotImplementedException();
 }
Пример #23
0
        public static IDBConnection GetConnection(string dbCode, EntityOperationType type, IEntityIdentity before, IEntityIdentity after, IEntityRequestContext context)
        {
            dbCode = DataConfig.Current.GetConnectionName(dbCode);

            IDBConnection connection = null;

            foreach (var operation in context.Operations)
            {
                var sqlOperation = operation as SqlOperation;
                if (sqlOperation == null)
                {
                    continue;
                }
                if (sqlOperation.DbCode == dbCode)
                {
                    connection = sqlOperation.Connection;
                }
            }

            if (connection == null && context.Who != null)
            {
                connection = DatabaseFactory.CreateDatabase(dbCode).AddClaimsDefaults(context.Who);
            }
            if (connection == null)
            {
                connection = DatabaseFactory.CreateDatabase(dbCode);
            }

            if (type != EntityOperationType.Get)
            {
                if (!connection.IsInTransaction)
                {
                    connection.BeginTrans();
                }

                context.Operations.Add(new SqlOperation
                {
                    DbCode     = dbCode,
                    Type       = type,
                    Before     = before,
                    After      = after,
                    Connection = connection
                });
            }

            return(connection);
        }
Пример #24
0
 public bool OnAddBefore <T>(IEntityRequestContext context, T entity) where T : class, IEntityIdentity
 {
     throw new UnauthorizedAccessException();
 }
Пример #25
0
        public static IEnumerable <T> GetPaged <T>(Container container, IEntityRequestContext context, IEntityInfo info, int skip, ref int count, bool retCount, string filterBy, string orderBy, IDBConnection database) where T : class, IEntityIdentity
        {
            using (Logger.CreateTrace(LoggingBoundaries.ServiceBoundary, typeof(SqlQuery), "GetPaged"))
            {
                try
                {
                    var      view = $"[{info.Module}].[VW_{info.Entity}]";
                    List <T> list = new List <T>();

                    using (var command = database.CreateStoredProcCommand("common", "usp_EntityGetByFilter"))
                    {
                        string where = null;
                        if (!string.IsNullOrEmpty(filterBy))
                        {
                            where = OData3FilterBuilder.ParseExpression(command, filterBy, info.Properties.Keys.ToArray());
                        }

                        command.AddInParameter("@view", view);
                        command.AddInParameter("@skip", skip);
                        command.AddInParameter("@retCount", retCount);
                        if (!string.IsNullOrEmpty(where))
                        {
                            command.AddInParameter("@where", where);
                        }
                        if (!string.IsNullOrEmpty(orderBy))
                        {
                            command.AddInParameter("@orderBy", orderBy.Replace(", ", ",").Replace(" ", "_"));
                        }
                        command.AddParameter("@count", ParameterDirection.InputOutput, count);
                        command.AddOutParameter("@debug", "");

                        var entity = new Entity();

                        var factory = container.GetInstance <IEntityCreateFactory>();

                        command.ExecuteReader(dataReader =>
                        {
                            T item = factory.CreateNew(info) as T;
                            while (PopulateEntity(item, info, dataReader, true))
                            {
                                list.Add(item);
                                item = factory.CreateNew(info) as T;
                            }
                        });

                        Logger.LogTrace(LoggingBoundaries.Database, "DYNAMIC SQL EXECUTED: {0}", command.GetOutParameter("@debug").Value.ToString());
                        if (retCount)
                        {
                            count = int.Parse(command.GetOutParameter("@count").Value.ToString());
                        }
                    }


                    return(list);
                }
                catch (Exception ex)
                {
                    if (Logger.HandleException(LoggingBoundaries.ServiceBoundary, ex))
                    {
                        throw;
                    }
                }
            }

            return(null);
        }