Срок действия области действия .NET Core DI в Ninject - PullRequest
0 голосов
/ 04 июля 2018

Редактировать: из-за того, что многие пользователи ошибочно воспринимают это как специфический вопрос ASP.NET. Обратите внимание, что мое приложение не является веб-приложением, и я не использую приложение ASP.NET (я использую его функциональность, которая также доступна в .NET Core).


В последнее время при настройке времени жизни Entity Framework DbContext в Ninject DI я копался в .NET Core Dependency Injection, потому что он уже имеет функциональность для регистрации DbContext и может быть найден здесь . Время жизни контекста по умолчанию: ServiceLifetime.Scoped.

В коде мы можем прочитать, что в приложениях ASP.NET «scoped» означает:

область создается вокруг каждого запроса к серверу

namespace Microsoft.Extensions.DependencyInjection
{
    //
    // Summary:
    //     Specifies the lifetime of a service in an Microsoft.Extensions.DependencyInjection.IServiceCollection.
    public enum ServiceLifetime
    {
        //
        // Summary:
        //     Specifies that a single instance of the service will be created.
        Singleton = 0,
        //
        // Summary:
        //     Specifies that a new instance of the service will be created for each scope.
        //
        // Remarks:
        //     In ASP.NET Core applications a scope is created around each server request.
        Scoped = 1,
        //
        // Summary:
        //     Specifies that a new instance of the service will be created every time it is
        //     requested.
        Transient = 2
    }
}

Я пытаюсь добиться аналогичной функциональности в Ninject DI, но очень сложно сказать, что было бы эквивалентно времени жизни в Ninject, когда я говорю о приложении .NET Core (, которое не является веб-интерфейсом). приложение! ).

Ninject имеет этот метод InRequestScope , однако он доступен только для веб-приложений, поэтому он действительно отличается от настройки .NET Core DI ServiceLifetime.Scoped.

Возможно, мне пришлось бы создать какую-то настраиваемую область в Ninject , но все же - я не совсем могу сказать, как добиться точно такого же поведения в области, как в .NET Core диатомовый Для этого мне нужно знать, как работает жизненный цикл в контексте приложения .NET Core в .NET Core DI. Я предполагаю, что существует один экземпляр создаваемого DbContext, который удаляется после завершения работы приложения.

Отсюда и мои вопросы :

  • Как работает настройка продолжительности жизни .NET Core DI scope и каков ее жизненный цикл?
  • Можно ли добиться аналогичного поведения в Ninject DI?

Ответы [ 2 ]

0 голосов
/ 08 июля 2018

Как работает настройка времени жизни области действия .NET Core DI и что это такое жизненный цикл?

.Net ядро ​​внутренне работает с классом ServiceScope. Когда вызывается новый запрос (например, веб-запрос), создается новый экземпляр с включенным новым поставщиком услуг. Во время запроса этот поставщик услуг используется для разрешения зависимостей. После того как запрос завершен, область действия удаляется, а также поставщик услуг с его разрешенными услугами.

  internal class ServiceScope : IServiceScope, IDisposable
  {
    private readonly Microsoft.Extensions.DependencyInjection.ServiceProvider _scopedProvider;

    public ServiceScope(Microsoft.Extensions.DependencyInjection.ServiceProvider scopedProvider)
    {
      this._scopedProvider = scopedProvider;
    }

    public IServiceProvider ServiceProvider
    {
      get
      {
        return (IServiceProvider) this._scopedProvider;
      }
    }

    public void Dispose()
    {
      this._scopedProvider.Dispose();
    }
  }

Можно ли добиться аналогичного поведения в Ninject DI?

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

Ninject - В какой области DbContext должен связываться, когда RequestScope не имеет смысла?

EDIT:

Принцип .NET Core DI такой же, как и у любого другого контейнера IOC. Он предоставляет зависимости вашим объектам (контроллеры MVC и т. Д.) С помощью DI и контролирует его время жизни.

  • Если для DbContext указывается время жизни синглтона, то только один создается, предоставляется DI по запросу и хранится в памяти для весь срок службы приложения / контейнера.
  • Если вы укажете переходный процесс, вы получите новый один все время DbContext запрашивается.
  • Если вы укажете область действия, Время жизни DbContext связано с некоторой одноразовой областью, которая создается в начале логического запроса (http-запрос в случае asp). Когда DbContext по запросу DI в первый раз, создается новый, хранится в памяти, и вы всегда получаете то же самое во время последующие запросы DI, пока область не будет удалена (с завершением http-запроса в случае asp) и DbContext с это.

Вы можете найти аналогичные параллели с TransactionScope. Здесь все sqlCommands внутри одного и того же TransactionScope зачисляются в одну и ту же транзакцию sql, если область удалена / зафиксирована.

0 голосов
/ 04 июля 2018

Существует метод расширения InRequestScope, который доступен в пакете nuget Ninject.Web.Common.

InRequestScope: https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope

Вы можете соотнести методы .net core и ninject DI от https://github.com/ninject/Ninject/wiki/Object-Scopes

...