Экземпляр ASP.NET Core Singleton в сравнении с производительностью временного экземпляра - PullRequest
0 голосов
/ 20 февраля 2019

В ASP.NET Core Inpendency Injection, мне просто интересно, будет ли регистрация Singleton экземпляров улучшать производительность лучше, чем регистрация Transient экземпляров или нет?

На мой взгляд, для Singleton экземпляра этоПросто стоит один раз за создание нового объекта и зависимых объектов.Для экземпляра Transient эта стоимость будет повторяться для каждого запроса на обслуживание.Так что Singleton кажется лучше.Но какой прирост производительности мы получаем при использовании Singleton над Transient?Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Как уже говорили другие, производительность не должна принимать ваше решение здесь: производительность не будет сильно снижена в любом случае.Следует учитывать зависимости, как управляемые, так и неуправляемые.Одиночки лучше всего подходят, когда вы используете ограниченные ресурсы, такие как сокеты и соединения.Если вам в конечном итоге придется создавать новый сокет каждый раз, когда сервис внедряется (временный), то вы быстро исчерпаете сокеты, и это действительно повлияет на производительность.

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

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

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

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

Теперь ASPDI .NET Core имеет как «временное», так и «ограниченное» время жизни.Оба из них являются «переходными» в том смысле, что они приходят и уходят, но «scoped» создается один раз за «область» (обычно запрос), тогда как «transient» всегда создается каждый раз, когдавпрыскивается.Здесь вы должны использовать «scoped», если у вас нет веской и явной причины использовать «transient».

0 голосов
/ 20 февраля 2019

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

Для получения более подробной информации, пожалуйста, перейдите по ссылке ниже, где разница очень подробно объяснена.https://stackoverflow.com/a/38139500/10551193

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

...