Cómo escribir la funcionalidad utilizando DDD / CQRS

Tengo un dominio de cuenta bancaria como se indica a continuación. Puede haber SavingsAccount, LoanAccount, FixedAccount y así sucesivamente. Un usuario puede tener múltiples cuentas. Necesito agregar una nueva funcionalidad: obtener todas las cuentas de un usuario. ¿Dónde debería estar escrita la función y cómo?

Sería genial si la solución sigue los principios SÓLIDOS (principio Abierto-cerrado, ...) y DDD.

Cualquier refactorización que mejore el código es bienvenida.

Nota: el AccountManipulator será utilizado por un cliente del sitio web a través de un servicio web.

namespace BankAccountBL
{
public class AccountManipulator
{
    //Whether it should beprivate or public?
    private IAccount acc;

    public AccountManipulator(int accountNumber)
    {
        acc = AccountFactory.GetAccount(accountNumber);
    }

    public void FreezeAccount()
    {
        acc.Freeze();
    }

}

public interface IAccount
{
    void Freeze();
}

public class AccountFactory
{
    public static IAccount GetAccount(int accountNumber)
    {
        return new SavingsAccount(accountNumber);
    }
}

public class SavingsAccount : IAccount
{
    public SavingsAccount(int accountNumber)
    {

    }

    public void Freeze()
    {

    }
}
}

LEYENDO:

¿Cuándo usar el patrón de diseño CQRS?

En el diseño controlado por dominio, ¿sería una violación de DDD poner llamadas a los repostiorios de otros objetos en un objeto de dominio?

Lógica de dominio de refactorización que accede a los repositorios en un sistema heredado

¿Cuál de estos ejemplos representa el uso correcto de DDD?

Buenos ejemplos de diseño impulsado por dominio

¿Ventajas de crear un repositorio genérico frente a un repositorio específico para cada objeto?

Respuestas a la pregunta(4)

Su respuesta a la pregunta