クールなソフトウェア アーキテクト募集:)
Company と User の 2 つのエンティティがあります。
ユーザーが Company に追加されると、Employee エンティティが作成されます。従業員は、ユーザーと会社の間のリンクを表します。Employee エンティティは、アクセス リストがないと役に立ちません。つまり、不変条件があります。親エンティティ (従業員) は、子 (アクセス リスト) と共に作成する必要があります。
この不変条件を C# コードに実装するソリューションを探しています。
従業員エンティティには、必須パラメーターを持つコンストラクターがあります。
public class Employee
{
public Employee(EmployeeCreationParams creationParams)
{
this.Company = creationParams.Company;
this.User = creationCommand.User;
}
public Company { get; protected set; }
public User { get; protected set; }
// other state and logic
}
子エンティティ:
public class EmployeeAccessList
{
public EmployeeAccessList(EmployeeAccessListCreationParams creationParams)
{ /* initialization logic */ }
public Employee { get; protected set; }
public OperationEnum Operation { get; protected set; }
}
汎用リポジトリ サービスがあります。
public class Repository
{
public void Persist<TEntity>(TEntity entity)
{
// internal stuff
}
}
Employee が作成されて永続化されます。
var employee = new Employee(creationParams);
_repository.Persist(employee);
また、 acl も永続化されます。
var accessList = CreateAccessList();
foreach(var acl in accessList)
{
_repository.Persist(acl);
}
従業員作成ロジックにアクセス リスト作成ログインを挿入する正しい方法が見つかりません。そのため、親と子の両方が 1 つのユニットとして作成されます。
子作成ロジックを親コンストラクターに追加しようとしました:
public class Employee
{
public Employee(EmployeeCreationParams creationParams)
{
this.Company = creationParams.Company;
this.User = creationCommand.User;
var accessList = CreateAccessList();
foreach(var acl in accessList)
{
_repository.Persist(acl);
}
}
}
..しかし、この解決策は正しくありません。子オブジェクトは、親エンティティの前に永続化されます。