Type to search pages and rules.

Browse pages

LS2011: Query Handler Takes a Repository

LS2011 is a compiler check that reports a query handler, the type that answers a read, taking a Domain repository in its constructor, which pulls an aggregate into a read that should project past it. This page states what the rule reports, where the error sits, and how to reach read data through the read session.

Markdown

Reference#

What the Rule Enforces#

LS2011 enforces Project queries directly (litespec/backend/application#project-queries-directly). It runs in Application, Infrastructure, and Worker. Its category is LiteSpec.Layers. Severity and enablement follow the Analyzers overview.

What the Rule Reports#

The rule reports a query handler, which is a class whose name ends in QueryHandler or that implements IQueryHandler, that takes a constructor parameter whose type is an interface named I*Repository. The diagnostic sits on the parameter type, and its message names the handler and the repository.

Failing Example#

C#
internal sealed class ListLoansQueryHandler(ILoanRepository loanRepository)
{
}

Passing Example#

C#
internal sealed class ListLoansQueryHandler(IQuerySession session)
{
}

How to Fix#

Project the read through the read session the handler takes as a constructor parameter, applying filter, scope, ordering, and limit before materialization.

Where the repository read a table kept beside the documents, such as a counter or a ledger written through plain SQL, move its SQL into the handler as a session query that selects one JSON object per row, as Query Through IQuerySession shows. Do not add a read interface in the repository's place.

Notes#

What the Rule Ignores#

The rule does not report a command handler taking a repository, a query handler taking any other type, or a repository passed outside a constructor. It does not report a parameter whose type is a concrete repository class. It does not run in Domain or WebApi.