C # - промежуточное ПО, которое добавляет значение поля к аргументу контроллера, если аргумент наследуется от интерфейса - PullRequest
2 голосов
/ 10 мая 2019

Я мог бы использовать некоторые советы или указатели. Мои знания по промежуточному программному обеспечению меня подводят сегодня.

Предположим, у меня есть конечная точка контроллера, которая выглядит следующим образом

public int Create([FromBody] InputDto InputDto)

И этот InputDto выглядит так

public class InputDto : IHasSpecialThingy
{
    public SpecialThingy SpecialThingy { get; set; }
    // Plus some other cool fields
}

Я пытаюсь достичь промежуточного промежуточного программного обеспечения, которое проверяет, когда объект наследует от «IHasSpecialThingy», добавив в него SpecialThingy ..

Я попытался создать свой собственный IModelBinder, но без особого успеха.

Промежуточное программное обеспечение, к сожалению, не является моей сильной стороной. Любой совет будет принята с благодарностью.

Заранее благодарю за любую помощь.

EDIT

Я начал с IActionFilter с пользовательской реализацией. Это должно быть хорошо. Нужно еще выяснить какую-нибудь инъекцию зависимости для этого. Я опубликую ответ, когда почистил его. Я все еще буду держать его открытым какое-то время, так как у меня может быть лучшее решение.

1 Ответ

1 голос
/ 12 июня 2019

Я нашел решение проблемы.Пожалуйста, смотрите код ниже.

public class SpecialThingyFilter : IActionFilter
{
    public bool AllowMultiple { get; }

    public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
    {
        var commandsWithSpecialThingy = actionContext.ActionArguments
            .Where(x => x.Value != null && x.Value.GetType().GetInterfaces().Contains(typeof(IHasSpecialThingy)))
            .Select(x => x.Value).ToList();

        if (!commandsWithSpecialThingy.Any())
        {
            return await continuation.Invoke();
        }

        foreach (var dto in commandsWithSpecialThingy)
        {
            //Do your magic stuffs here
            ((IUserRightsDependentCommand)dto).specialThingy = // Something special
        }

        return await continuation.Invoke();
    }
}

Вы также можете использовать DI в фильтре действий, если ваш контейнер DI настроен правильно.

var specialtyService = actionContext.ControllerContext
      .Configuration.DependencyResolver
      .GetService(typeof(ISpecialtyService)) as ISpecialtyService;

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

...