Ваш пример класса UnitOfWork
фактически применяет плохую практику.Правило состоит в том, что класс должен распоряжаться только тем, что ему принадлежит .Однако в случае UnitOfWork
он не владеет DbContext
, так как он не создается UnitOfWork
, а предоставляется другим лицом.
Letting UnitOfWork
избавиться от этого DbContext
даже проблематично, поскольку UnitOfWork
не может узнать, используется ли или нет DbContext
другими классами в системе, когда утилизируется UnitOfWork
.Другими словами, система может сломаться, когда UnitOfWork
начнет избавляться от этой зависимости.
Так что, если вы следуете правилу распоряжения только тем, что у вас есть , это означает, что UnitOfWork
должно вфакт не реализовать IDisposable
вообще.А это значит, что вы позволяете «кому-то другому» управлять временем жизни DbContext
.
Эта идея переноса контроля над временем жизни зависимостей (таких как DbContext
) третьей стороне не является чем-тоновый, и, конечно, не что-то конкретное для нового контейнера Microsoft DI.На самом деле это старая идея, которая заключается в том, что вы централизуете контроль над временем жизни компонентов приложения на пути запуска приложения.В контексте DI этот начальный путь обычно упоминается как Composition Root .
Внутри Composition Root, это будет работа Composer создавать компоненты приложения, управлять их временем жизни и утилизировать их, когда они больше не нужны.Контейнер DI (такой как DI-контейнер .NET Core) выступает в роли Composer в вашей системе, но вы можете сделать это также вручную - практика, известная как Pure DI .