1

ドメイン駆動設計に従う場合、実際にサービス クラスを実装するための最良の方法は何ですか?

たとえば、AccountServiceあるアカウントから別のアカウントに資金を転送するために使用できる が必要だとしますか? 次のうち、これを実装するための最良の方法はどれですか?

public class AccountService1
{
    private IAccountRepository _accountRepo;

    public AccountService1(IAccountRepository accountRepo)
    {
        _accountRepo = accountRepo;
    }

    public void TransferFunds(double ammount, int sourceAccountNumber, int targetAccountNumber)
    {
        //FUNDS TRANSFER CODE
    }
}

public class AccountService2
{
    public void TransferFunds(double ammount, Account sourceAccount, Account targetAccount)
    {
        //FUNDS TRANSFER CODE
    }
}


public static class AccountService3
{
    public static void TransferFunds(double amount, Account sourceAccount, Account targetAccount)
    {
        //FUNDS TRANSFER CODE
    }
}

public static class AccountService4
{
    public static void TransferFunds(double amount, int sourceAccountNumber, int targetAccountNumber, IAccountRepository repository)
    {
        //FUNDS TRANSFER CODE
    }
}
4

3 に答える 3

3

あなたがリストしたすべての方法は、貧血ドメインへの道を下ります.

アカウントエンティティのインスタンスメソッドになれない理由はありますか?

public class Account {
    public void Transfer(decimal amount, Account recipient);
}
于 2011-07-19T23:21:37.413 に答える
2

例がアプリケーション サービスかドメイン サービスかは明確ではありません。例 1 はアプリケーション サービスがどのように見えるかを示し、例 2 はドメイン サービスがどのように見えるかを示しています。まとめると、次のようになります。

public class AccountApplicationService
{
    private IAccountRepository _accountRepo;

    public AccountApplicationService(IAccountRepository accountRepo)
    {
        _accountRepo = accountRepo;
    }

    public void TransferFunds(double ammount, int sourceAccountNumber, int targetAccountNumber)
    {
        Account sourceAccount = _accountRepo.GetById(sourceAccountNumber);
        Account targetAccount = _accountRepo.GetById(targeteAccountNumber);

        IAccountDomainService accDomService = new AccountDomainService();

        accDomService.TransferFunds(ammount, sourceAccount, targetAccount);

        using(Transaction tran = _accountRepo.BeginTransaction()) //note: pseudo code.
        {
             _accountRepo.Save(sourceAccount);
             _accountRepo.Save(targetAccount);
             tran.Commit();
        }
    }
}
于 2011-07-21T13:58:00.067 に答える