-1

У меня есть приложение asp.net mvc, в котором многие вещи зависят от знания URL-запроса веб-запроса (это многопользовательский). В настоящее время HttpContext вводится во множество конструкторов (через оболочку, которая устанавливает некоторые переменные на основе контекста) с помощью Simple Injector. Это означает, что большинство вещей нужно вводить «за веб-запрос» и за приложение.Усиление производительности инсталляции веб-приложений с помощью инъекции зависимостей

Теперь, что я мог сделать, просто передать оболочку HttpContext или только необходимые данные в методах, а не в инжекции конструктора.

То, что я хотел бы получить, - это фактическая разница в производительности. Потому что это делает его намного менее изящным, чтобы всегда передавать обертку/данные. Это, однако, довольно высокий трафик, поэтому я обязательно подумаю о его изменении.

Я понимаю, что это зависит от того, что происходит в конструкторе, но предположим, что все, что он делает, это назначить зависимости.

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

+0

ли вы 'HttpContext'-обертка содержат данные, или логика для извлечения данных всякий раз, когда это свойство или метод называется? Если последнее, то нет необходимости быть инстанцированным для каждого веб-запроса; вы можете использовать один экземпляр (поскольку он будет использовать HttpContext.Current за сценой). – Maarten

+0

Итак, вы говорите, что вы [вводите данные времени выполнения в свои компоненты] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99). – Steven

+0

Здесь я пропущу цифры и факты. Является ли это гипотетическим или у вас проблема с производительностью? Вы это оценили? Профилировали ли вы его, чтобы выяснить, где проблема? У меня возникает соблазн закрыть этот вопрос без такой информации. – Steven

ответ

1

Вместо простой обертки вы можете разместить провайдера между ними, что может быть одноточечным, что позволяет всем потребителям быть одноэлементным.

Как это:

public interface IHttpContextProvider 
{ 
    HttpContext CurrentContext { get; } 
} 

public class HttpContextProvider : IHttpContextProvider 
{ 
    public HttpContext CurrentContext => HttpContext.Current; 
} 

public interface IMyContextWrapper 
{ 
    string CurrentRoute { get; } 
} 

public class MyContextWrapper : IMyContextWrapper 
{ 
    private readonly IHttpContextProvider httpContextProvider; 

    public MyContextWrapper(IHttpContextProvider httpContextProvider) 
    { 
     this.httpContextProvider = httpContextProvider; 
    } 

    public string CurrentRoute 
    { 
     get 
     { 
      var context = this.httpContextProvider.CurrentContext; 
      return informationFromContext; 
     } 
    } 
} 
+0

Если потребители этого поставщика не содержат состояния, а не просто логики. – Maarten

+0

Да, я не думаю, что это работает для меня, так как я настраиваю кучу вещей в своей обертке на основе контекста. Поэтому мне придется делать эту настройку каждый раз, когда она используется, которую я хочу избежать. – JuhaKangas

+0

В этом случае применяется комментарий от @Steven, и вы [вводите данные времени выполнения в свои компоненты] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99), который является базой вашей текущей проблемы –

0

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

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

Я создал сайт с несколькими арендаторами и имел определенные услуги, которые необходимо создать для каждого веб-запроса, и определенно не имели проблем с производительностью в этой области.

+0

Я добавил редактирование, что это в основном вопрос оптимизации, у меня нет конкретной проблемы с производительностью. – JuhaKangas

+0

Конечно, я это понял. Вот почему я предложил делать то, что наиболее естественно в коде, а не оптимизировать, где у вас нет проблемы. –

+0

Да, я бы предпочел инъекцию конструктора, но я больше искал ответ на разницу в производительности. – JuhaKangas

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