Como escrever funcionalidade usando DDD / CQRS

Eu tenho um domínio de conta bancária, conforme listado abaixo. Pode haver SavingsAccount, LoanAccount, FixedAccount e assim por diante. Um usuário pode ter várias contas. Eu preciso adicionar uma nova funcionalidade - obter todas as contas para um usuário. Onde deveria estar a função escrita e como?

Seria ótimo se a solução seguisse os princípios do SOLID (princípio Open-Closed, ...) e DDD.

Qualquer refatoração que torne o código melhor é bem-vinda.

Nota: O AccountManipulator será usado por um cliente do site em um serviço da 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()
    {

    }
}
}

LEITURA:

Quando usar o padrão de design CQRS?

Em design orientado a domínio, seria uma violação do DDD colocar chamadas para repostioridades de outros objetos em um objeto de domínio?

Refatorando lógica de domínio que acessa repositórios em um sistema legado

Quais destes exemplos representam o uso correto de DDD?

Amostras de design orientado por bom domínio

Vantagem de criar um repositório genérico versus repositório específico para cada objeto?

questionAnswers(4)

yourAnswerToTheQuestion