适当的业务逻辑层架构

时间:2017-06-18 20:24:19

标签: c# architecture domain-driven-design enterprise business-logic

不确定SO是否适合这个问题(可能是SoftwareEng或CodeReview),但我们试一试。

我无法为以下简单的业务逻辑创建适当的架构。我们希望其用户能够在我们的系统中创建新的AccountAddAccount方法应返回其新分配的ID(例如int)。用户还可以UpdateAccount,并更改几乎所有内容,IdUsername以及货币Balance除外。

到目前为止,我有以下模型,我不满意:

class Account
{
    public int Id { get; set; }        
    public decimal Balance { get; set; } 
    public string Username { get; set; }
    public AccountInfo Info { get; set; } // we can change these in UpdateAccount
}
class AccountInfo
{
    public string Address { get; set; }
    public Image Avatar { get; set; }
    public ushort SomeBoringProperty { get; set; }
    public string AnotherOne { get; set; }
}

此模型导致以下业务逻辑类:

class BusinessLogic
{
    IAccountRepository accountRepo;
    public int AddAccount(Account newAccount)
    {
        if(false == ValidateAccountAndMakeSureUsernameIsUnique(newAccount))
            throw new ApplicationException("Whatever");

        newAccount = 0.0m; // I don't like this!

        int assignedId = accountRepo.Add(newAccount);

        return assignedId;
    }
    public void UpdateAccountInfo(int accountId, AccountInfo newInfo)
    {
        var account = repo.GetAccountById(accountId);

        account.Info = newInfo;

        repo.UpdateAccount(account);
    }
}

我不喜欢我们手动设置newAccount = 0.0m的事实。我们只从用户提交的Username对象中获取Info + Account,那么他为什么要首先发送一些虚拟IdBalance! ?

某些属性(例如Balance,将来可能更多)不能由用户直接更改,而其他属性(Username)则在Account创建时定义并保留不变。我做的越多,我就越觉得为每个操作创建两个新类型的诱惑,例如AccountCreationResult CreateUser(AccountCreationRequest request)然后集中使用Automapper等,但我认为这不是正确的方法

与此同时,我对DDD风格的方法有着复杂的感觉 - 在我的BLL用户向我发回更新的聚合以保存之后,我必须检查一下Id,{{ 1}},Username保持不变 - 我认为使用多个事务脚本更安全。

是否有任何设计模式或处理此类问题的方法?或者我的OCD伤害了我,我应该接受现实并设置Balance然后继续?

谢谢!

0 个答案:

没有答案