ドメインモデルファクトリを実装する方法と場所を理解しようとしています。Company
集計を、それをどのように行ったかのデモとして含めました。
私は最後に私の設計決定を含めました-それらの点に関するコメント、提案、批評をいただければ幸いです。
Company
ドメインモデル:
public class Company : DomainEntity, IAggregateRoot
{
private string name;
public string Name
{
get
{
return name;
}
private set
{
if (String.IsNullOrWhiteSpace(value))
{
throw new ArgumentOutOfRangeException("Company name cannot be an empty value");
}
name = value;
}
}
internal Company(int id, string name)
{
Name = name;
}
}
CompanyFactory
ドメイン工場:
このクラスは、ドメインモデルの新しいインスタンスを作成するときに、ビジネスルールと不変条件に違反しないようにするために使用されます。ドメイン層に存在します。
public class CompanyFactory
{
protected IIdentityFactory<int> IdentityFactory { get; set; }
public CompanyFactory(IIdentityFactory<int> identityFactory)
{
IdentityFactory = identityFactory;
}
public Company CreateNew(string name)
{
var id = IdentityFactory.GenerateIdentity();
return new Company(id, name);
}
public Company CreateExisting(int id, string name)
{
return new Company(id, name);
}
}
CompanyMapper
エンティティマッパー:
このクラスは、リッチドメインモデルとEntity Frameworkデータエンティティ間のマッピングに使用されます。インフラストラクチャ層に存在します。
public class CompanyMapper : IEntityMapper<Company, CompanyTable>
{
private CompanyFactory factory;
public CompanyMapper(CompanyFactory companyFactory)
{
factory = companyFactory;
}
public Company MapFrom(CompanyTable dataEntity)
{
return DomainEntityFactory.CreateExisting(dataEntity.Id, dataEntity.Name);
}
public CompanyTable MapFrom(Company domainEntity)
{
return new CompanyTable()
{
Id = domainEntity.Id,
Name = domainEntity.Name
};
}
}
Company
コンストラクタは、次のように宣言されていますinternal
。
理由:ファクトリーのみがこのコンストラクターを呼び出す必要があります。internal
他のレイヤーがインスタンス化できないようにします(レイヤーはVSプロジェクトによって分離されます)。この
CompanyFactory.CreateNew(string name)
方法は、システムで新しい会社を作成するときに使用されます。
理由:まだ永続化されていないため、新しい一意のIDを生成する必要があります(を使用IIdentityFactory
)。この
CompanyFactory.CreateExisting(int id, string name)
メソッドはCompanyRepository
、データベースからアイテムを取得するときにによって使用されます。
理由:モデルにはすでにIDがあるため、これをファクトリーに提供する必要があります。CompanyMapper.MapFrom(CompanyTable dataEntity)
使用されるCompanyRepository
永続からデータを取り出します。
理由:ここでは、Entity Frameworkデータエンティティをドメインモデルにマップする必要があります。CompanyFactory
ビジネスルールが満たされていることを保証するために、ドメインモデルを作成するために使用されます。CompanyMapper.MapFrom(Company domainEntity)
で使用されるCompanyRepository
持続性への追加や更新モデル。
理由: Entity Frameworkがデータベースで行う変更を認識できるように、ドメインモデルをデータエンティティのプロパティに直接マッピングする必要があります。
ありがとう