Tôi đang cố gắng để hiểu làm thế nào và ở đâu để thực hiện các nhà máy mô hình miền. Tôi đã bao gồm Company
tổng hợp của tôi như là một bản demo về cách tôi đã thực hiện nó.
Tôi đã bao gồm các quyết định thiết kế của tôi vào cuối - tôi sẽ đánh giá cao bất kỳ ý kiến, đề xuất, phê bình về những điểm đó.
Các Company
mô hình miền:
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;
}
}
Nhà CompanyFactory
máy tên miền:
Lớp này được sử dụng để đảm bảo rằng các quy tắc kinh doanh và bất biến không bị vi phạm khi tạo các phiên bản mới của các mô hình miền. Nó sẽ nằm trong lớp miền.
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);
}
}
Ánh CompanyMapper
xạ thực thể:
Lớp này được sử dụng để ánh xạ giữa các mô hình miền phong phú và các thực thể dữ liệu Entity Framework. Nó sẽ nằm trong các lớp cơ sở hạ tầng.
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
};
}
}
Các
Company
constructor được khai báo làinternal
.
Lý do: Chỉ có nhà máy nên gọi nhà xây dựng này.internal
đảm bảo rằng không có lớp nào khác có thể khởi tạo nó (các lớp được phân tách bằng các dự án VS).Các
CompanyFactory.CreateNew(string name)
phương pháp sẽ được sử dụng khi tạo ra một công ty mới trong hệ thống.
Lý do: Vì nó chưa được duy trì, nên một danh tính duy nhất mới sẽ cần được tạo cho nó (sử dụngIIdentityFactory
).Các
CompanyFactory.CreateExisting(int id, string name)
phương pháp sẽ được sử dụng bởi cácCompanyRepository
mặt hàng khi lấy từ cơ sở dữ liệu.
Lý do: Mô hình đã có sẵn danh tính, vì vậy điều này sẽ cần được cung cấp cho nhà máy.Các
CompanyMapper.MapFrom(CompanyTable dataEntity)
sẽ được sử dụng bởi cácCompanyRepository
dữ liệu khi lấy từ sự kiên trì.
Lý do: Ở đây các thực thể dữ liệu Entity Framework cần được ánh xạ vào các mô hình miền. CácCompanyFactory
sẽ được sử dụng để tạo ra các mô hình miền để đảm bảo rằng quy tắc kinh doanh được thỏa mãn.Các
CompanyMapper.MapFrom(Company domainEntity)
sẽ được sử dụng bởi cácCompanyRepository
mô hình khi thêm hoặc cập nhật để kiên trì.
Lý do: Các mô hình miền cần được ánh xạ thẳng vào các thuộc tính thực thể dữ liệu để Entity Framework có thể nhận ra những thay đổi cần thực hiện trong cơ sở dữ liệu.
Cảm ơn