Ответы пользователя по тегу RESTful API
  • Как работать с api на angularJS?

    0X12eb
    @0X12eb
    1. Для управления конвейером запросов используйте middleware
    2. Откажитесь от использования $rootScope, используйте ванильный localStorage для хранения переменной
    Ответ написан
    Комментировать
  • Уровень доступа к данным .NET Core и Dapper?

    0X12eb
    @0X12eb
    Выбор Dapper ORM чем то аргументирован?
    Если Вам действительно нужна та скорость с которой даппер маппит, но Вы готовы пожертвовать скоростью написания кода тогда делайте так:

    1. Реализуем SqlBuilder под все нужды:
    public interface ISqlBuilder
        {
            SqlBuilder.Template AddTemplate(string sql, dynamic parameters = null);
            ISqlBuilder LeftJoin(string sql, dynamic parameters = null);
            ISqlBuilder PagingLeftJoin(string sql, dynamic parameters = null);
            ISqlBuilder Where(string sql, dynamic parameters = null);
            ISqlBuilder PagingWhere(string sql, dynamic parameters = null);
            ISqlBuilder OrderBy(string sql, dynamic parameters = null);
            ISqlBuilder PagingOrderBy(string sql);
            ISqlBuilder Select(string sql, dynamic parameters = null);
            ISqlBuilder AddParameters(dynamic parameters);
            ISqlBuilder Join(string sql, dynamic parameters = null);
            ISqlBuilder GroupBy(string sql, dynamic parameters = null);
            ISqlBuilder Having(string sql, dynamic parameters = null);
        }


    2. Под каждое конструирование запросов пишем свой класс, реализуем интерфейс IQueryBuilder для дальнейшей инъекции зависимости в сервисах:

    using Dapper;
    
        public class MyEntityQueryBuilder : IQueryBuilder<T>
            where T: IEntity
        {
            private readonly ISqlBuilder _sqlBuilder;
            private readonly SqlBuilder.Template _entityTemplate;
            private readonly string entity_template = @"
                   select 
                         /**select**/ 
                   from 
                         entity_table e 
                   /**leftjoin**/
                   /**where**/ 
                   /**orderby**/
            ";
            private readonly string split_on = "Id";
    
            public MyEntityQueryBuilder(ISqlBuilder sqlBuilder)
            {
                _sqlBuilder = sqlBuilder.AddTemplate(entity_template);
            }
    
            public Query Build(EntityFilter filter)
            {
                Select();
                LeftJoin();
                Where(filter);
                Order();
                return new Query
                {
                    Sql = _entityTemplate.RawSql,
                    Parameters = _entityTemplate.Parameters,
                    SplitOn = split_on,
                };
            }
    
            private void Select()
            {
                _builder.Select("e.Id");
                _builder.Select("e.Title");
            }
    
            private void LeftJoin()
            {
                _builder.LeftJoin("asn_Responsibles r1 on r1.Id = e.MainResponsibleId");
                _builder.LeftJoin("asn_EventResponsibles er on er.EventId = e.Id");
            }
    
            private void Where(EntityFilter filter)
            {
                _builder.Where("e.IsDeleted = 0");
                if (filter == null)
                {
                    return;
                }
                if (filter.Id.HasValue)
                {
                    _builder.Where("e.Id = @id", new { id = filter.Id });
                }
                if (filter.IsRootOnly)
                {
                    _builder.Where("e.ParentId is null");
                }
            }
    
            private void Order()
            {
                _builder.OrderBy("e.CreateDate");
            }
        }


    3. Нужен абстрактный репозиторий? Реализуйте IRepository и инжекте уже туда Ваши свежеиспеченные QueryBuilders для дальнейшего маппинга даппером.

    Удачи (:
    Ответ написан
    Комментировать
  • Как в Angular2 навесить события и обращаться к атрибутам для html пришедшего из api?

    0X12eb
    @0X12eb
    По средствам чего вы планируете обрабатывать эти самые клики и получать значения атрибутов?
    Если, например, будете использовать jQuery, то подойдет такой вариант:
    import { Pipe, PipeTransform } from '@angular/core';
    import { DomSanitizer } from '@angular/platform-browser'
    
    @Pipe({ name: 'safeHtml' })
    export class SafeHtmlPipe implements PipeTransform {
        constructor(private sanitized: DomSanitizer) { }
        transform(value: string) {
            return this.sanitized.bypassSecurityTrustHtml(value);
        }
    }

    Затем рендерим контент который пришел из RestAPI и работаем со всеми пришедшими тегами и атрибутами:

    <div [innerHTML]="data.content | safeHtml"></div>
    Ответ написан
    Комментировать