2016-12-07 4 views
0

У меня есть приложение MVC 5, чей back-end является веб-API. Для каждого запроса на мой сервер мне нужно предоставить пользовательский агент, который я могу получить в методе действий контроллера, например var UserAgent = Request.UserAgent.ToString();, и передать его потом в другом классе (Controller => Service => HttpRequester => XXXHttpClient) и, наконец, использовать в реальном запросе в XXXHttpClient класс, но я думаю, что может быть лучший способ добиться того же. Я попытался это сделать, но не нашел ничего подходящего, так что кто-нибудь может мне помочь, что было бы лучше. Если я хочу получить пользовательский агент непосредственно в классе XXXHttpClient, вместо того, чтобы впоследствии его передавать.User-Agent в приложении mvc 5

ответ

1

Немного о широком вопросе с множеством возможных ответов.

Передача данных через все слои обычно не очень хорошо.

Что бы я сделал, это создать фильтр действий MVC, который захватывает пользовательский агент и устанавливает его на объект. Класс объекта может быть таким:

public class RequestContext 
{ 
    public string UserAgent { get; set; } 
} 

Используйте свою инфраструктуру инъекции зависимостей, чтобы вводить эту информацию за один раз. Тогда фильтр действий и слой, который зависит от данных, будут использовать один и тот же экземпляр, позволяя вам получать данные на любой слой, который ему нужен.

Другой вариант, который использует статическое свойство:

HttpContext.Current.Request.UserAgent 

большую производительность, легче читать, но ниже тестируемость :)

+0

один раз за запроса средств на уровне метода действий? –

+0

Да, обычно структуры DI предлагают «временную» область, которая означает, что экземпляр создается для каждого объекта, который требует его, «Singleton» scope, который означает, что один экземпляр совместно используется всеми запрошенными объектами, и область «запроса», которая означает любые объекты, созданные как часть одного HTTP-запроса, получают один и тот же экземпляр. В Ninject это 'InRequestScope()'. – juunas

+0

Если возможно, предложите какой-нибудь код или ссылку для ссылки? –

Смежные вопросы