C#: передача данных из контроллера в прикладной уровень в слой DBContext - PullRequest
0 голосов
/ 30 апреля 2020

Я бы хотел передать глобальные пользовательские данные из уровня API в прикладную службу, в хранилище и на уровень контекста БД без использования параметров в каждом методе.

1) Один из методов - HttpContextAccessor.

Интересно, есть ли какой-либо другой глобальный параметр, встроенный в Net Core, или это единственная известная стратегия? Мы передаем проверяемые данные, CreateBy, ModifiedDate, но можем расширить их другими свойствами. У нас есть 100+ API, методы приложений, репозитории и попытки предотвратить передачу параметров.

_httpContextAccessor.HttpContext.Items["TestKey"] = "SampleData";

DBContext:

public class AuditableDbContext: DbContext
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public AuditableDbContext(DbContextOptions<AuditableDbContext> options, IHttpContextAccessor httpContextAccessor)
        : base(options)
    {
        _httpContextAccessor = httpContextAccessor;
    }

Изменения пользовательских данных основаны на на поведение приложения и взаимодействие с пользователем.

1 Ответ

1 голос
/ 30 апреля 2020

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

Представьте, что вы полагаетесь на элемент HttpContext, поступающий от вашего контроллера на другом уровне. Модульное тестирование этого уровня теперь должно имитировать c контроллер и устанавливать элемент в контексте для получения правильного состояния.

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

public class RequestState
{
  public User CreateBy { get; }
  ...
}

Контроллер будет инициировать объект состояния, и все слои будут использовать его ...

Другим способом было бы полагаться на структуру DI и использовать объект жизненного цикла с заданной областью действия, который вставляется во все слои, которые затем можно использовать для хранения своих данных. государственная информация. Это очень похоже на http-контекст, но, по крайней мере, это ваша собственная вещь, и вы можете делать с ней все, что захотите, а также добавлять строго типизированные свойства вместо коллекции Items.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...