Как вызвать сервис приложений из Web Api в проекте ASP. Net Boilerplate MVC? - PullRequest
0 голосов
/ 30 апреля 2020

ASP. NET Boilerplate (. Net Framework v4.7.2 & MVC)

Я создаю контроллер веб-API (AgentInfoController) для класса обслуживания приложения (AgentInfoAppService), который зависит от хранилища IAgentInfoRepository. Из AgentInfoController я могу вызывать метод из AgentInfoAppService, передавая IAgentInfoRepository в конструктор, подобный этому new AgentInfoAppService(_agentInfoRepository).GetAgentCampaignswithCode, но я не уверен, что это правильный путь?

У нас есть рабочий код из mvc слой, где мы вызываем класс обслуживания приложения (Dynami c слой веб-API) без добавления каких-либо ссылок на репозиторий, как показано ниже. Есть ли способ, которым мы могли бы добавить внедрение зависимостей, чтобы мне не нужно было добавлять репозиторий при каждом вызове службы приложения из уровня веб-API? Пожалуйста, сообщите.

jQuery.ajax({
    url: "/api/services/app/AgentInfoAppService/GetAgentCampaignswithCode?agentCode=100",
    type: "GET",
    contentType: "application/json; charset=utf-8"
})

public class AgentInfoAppService : ApplicationService, IAgentInfoAppService
{
    private readonly IAgentInfoRepository _agentInfoRepository;

    public AgentInfoAppService(IAgentInfoRepository agentInfoRepository)
    {
        _agentInfoRepository = agentInfoRepository;
    }

     public GetAgentCodeCampaignOutput GetAgentCampaignswithCode(string agentCode, bool? defaultCampaign)
    {
        var agentCampaigns = _agentInfoRepository.GetAgentCampaignswithCode(agentCode, defaultCampaign);
        return new GetAgentCodeCampaignOutput()
        {
            AgentCodeCampaign = Mapper.Map<List<AgentCodeCampaignDto>>(agentCampaigns)
        };
    }
}

 public class AgentInfoController : AbpApiController
{

    private readonly IAgentInfoRepository _agentInfoRepository;

    [HttpGet]
    public GetAgentCodeCampaignOutput GetAgentCampaignswithCode(string agentCode, bool? defaultCampaign)
    {
        return new AgentInfoAppService(_agentInfoRepository).GetAgentCampaignswithCode(agentCode, defaultCampaign);
    }
}

1 Ответ

0 голосов
/ 30 апреля 2020

При запуске проекта Abp создает все методы из слоя ApplicationService и вы можете использовать его. Вам не нужно снова создавать метод в контроллере.

Вот пример того, что я говорю

У меня есть ApplicationServie метод, подобный этому

public class CiudadAppService : AsyncCrudAppService<AdozonaCiudad, CiudadDto, int, PagedAndSortedRequest, CiudadDto, CiudadDto>, ICiudadAppService
{

    private readonly ICiudadManager _ciudadManager;
    public CiudadAppService(IRepository<AdozonaCiudad> repository, ICiudadManager ciudadManager) : base(repository)
    {
        _ciudadManager = ciudadManager;
    }

    public override async Task<CiudadDto> CreateAsync(CiudadDto input)
    {

        var result = await _ciudadManager.RegistrarOActualizar(ObjectMapper.Map<AdozonaCiudad>(input));

        return MapToEntityDto(result);
    }
}

В этом AppService у меня есть один метод с именем CreateAsync, этот метод можно использовать из javascript следующим образом.

(function ($) {

var _ciudadService = abp.services.app.ciudad;
var _$form = $('form[name=Index]');

function save() {

    _$form.validate({
        invalidHandler: function (form, validator) {
            var errors = validator.numberOfInvalids();
            if (errors) {
                var firstInvalidElement = $(validator.errorList[0].element);
                $('html,body').scrollTop(firstInvalidElement.offset().top - 100);
                firstInvalidElement.focus();
            }
        },

        rules: {
            Ciudad: "required"
        },
        messages: {
            Ciudad: "El valor del campo es requerido"
        },
        highlight: function (element) {
            $(element).parent().addClass('error-validation')
        },
        unhighlight: function (element) {
            $(element).parent().removeClass('error-validation')
        }
    });

    if (!_$form.valid()) {
        return;
    }

    var ciudad = _$form.serializeFormToObject(); //serializeFormToObject is defined in main.js

    abp.ui.setBusy(_$form);
    _ciudadService.create(ciudad).done(function () {
        location.reload(true); //reload page to see edited role!
        abp.notify.success('Registro correcto');
        $(".save-button").html('Guardar');
    }).always(function () {
        abp.ui.clearBusy(_$form);
    });
}
}

Как вы видите, важная часть: var _ciudadService = abp.services.app.ciudad; с этим вы создаете сервис и можете получить доступ ко всем методам, которые у вас есть в ApplicationService

Я надеюсь, что это может помочь вам, если вам нужна дополнительная помощь, пожалуйста, оставьте комментарий!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...