Одной из проблем использования контекстно-зависимых объектов на нескольких уровнях является зависимость от этого контекста. Это действительно затрудняет понимание кода в долгосрочной перспективе, и, что самое важное, затрудняет модульное тестирование.
Представьте, что вы полагаетесь на элемент HttpContext, поступающий от вашего контроллера на другом уровне. Модульное тестирование этого уровня теперь должно имитировать c контроллер и устанавливать элемент в контексте для получения правильного состояния.
Наличие нескольких параметров, передаваемых повсюду, тоже плохо, правда. Одним из способов решения этой проблемы будет простой объект Poco для хранения состояния и его передачи, что упростит модульное тестирование, а также уменьшит количество параметров методов во всех слоях.
public class RequestState
{
public User CreateBy { get; }
...
}
Контроллер будет инициировать объект состояния, и все слои будут использовать его ...
Другим способом было бы полагаться на структуру DI и использовать объект жизненного цикла с заданной областью действия, который вставляется во все слои, которые затем можно использовать для хранения своих данных. государственная информация. Это очень похоже на http-контекст, но, по крайней мере, это ваша собственная вещь, и вы можете делать с ней все, что захотите, а также добавлять строго типизированные свойства вместо коллекции Items.
При запуске вы вводите область действия объект с Scoped продолжительностью жизни. Вы вводите объект в свой контроллер и все другие классы (работает, только если эти классы также ограничены или являются временными).