不确定SO是否适合这个问题(可能是SoftwareEng或CodeReview),但我们试一试。
我无法为以下简单的业务逻辑创建适当的架构。我们希望其用户能够在我们的系统中创建新的Account
,AddAccount
方法应返回其新分配的ID(例如int
)。用户还可以UpdateAccount
,并更改几乎所有内容,Id
,Username
以及货币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
,那么他为什么要首先发送一些虚拟Id
和Balance
! ?
某些属性(例如Balance
,将来可能更多)不能由用户直接更改,而其他属性(Username
)则在Account
创建时定义并保留不变。我做的越多,我就越觉得为每个操作创建两个新类型的诱惑,例如AccountCreationResult CreateUser(AccountCreationRequest request)
然后集中使用Automapper等,但我认为这不是正确的方法
与此同时,我对DDD风格的方法有着复杂的感觉 - 在我的BLL用户向我发回更新的聚合以保存之后,我必须检查一下Id
,{{ 1}},Username
保持不变 - 我认为使用多个事务脚本更安全。
是否有任何设计模式或处理此类问题的方法?或者我的OCD伤害了我,我应该接受现实并设置Balance
然后继续?
谢谢!