如何为 IAggregateRoot 管理 Guard.Against.NotFound
How To Manage Guard.Against.NotFound for IAggregateRoot
我想知道如果 projectId 存在于数据库中,我们是否要检查添加新项目,shell 我们以某种方式在 AddItem
方法中插入 Guard.Agains.NotFound(???)
或不?
我问是因为如果创建一些实体:
public class Country : BaseEntity<int>, IAggregateRoot
{
public string Name { get; private set; }
private readonly List<District> _districts = new List<District>();
public IEnumerable<District> Districts => _districts.AsReadOnly();
public Country(string name)
{
Name = Guard.Against.NullOrEmpty(name, nameof(name));
}
public void AddDistrict(District newDistrict)
{
Guard.Against.Null(newDistrict, nameof(newDistrict));
Guard.Against.NegativeOrZero(newDistrict.CountryId, nameof(newDistrict.CountryId));
_districts.Add(newDistrict);
}
}
public class District : BaseEntity<int>, IAggregateRoot
{
public string Name { get; set; }
public int CountryId { get; set; }
public List<Municipality> Municipalities { get; set; }
}
我们如何验证请求发送的 countryId 是否存在于数据库中?
例如,如果创建集成测试,如:
[Fact]
public async Task AddDistrict()
{
var districtName = "District";
var countryRepository = GetCountryRepository();
var country = new Country("Country");
await countryRepository.AddAsync(country);
var district = new District
{
CountryId = 2,
Name = districtName
};
country.AddDistrict(district);
await countryRepository.UpdateAsync(country);
Assert.Equal(1, district.Id);
}
无论我输入整数值,因为 CountryId 测试都会通过,直到不是 0 或负整数,但我想检查数据库中是否存在该国家/地区实体的 ID。管理此支票的最佳地点在哪里?
此致,
最简单的方法是请求将 Country 对象提供给 District 的构造函数:
public class District
{
public string Name { get; private set; }
public int CountryId { get; private set; }
public District(string name, Country country)
{
if (country == null)
throw new Exception("Missing country.");
Name = name;
CountryId = country.Id
}
}
现在您已强制域的客户端提供国家/地区。如果客户端(应用层)无法根据提供的 id 从 Country 存储库中检索有效的 Country,那么您的构造函数将在获取 null country 时抛出。
或者,将 CountryId 保留为 District 的构造函数参数,将 District 构造函数设为内部,这样它就无法在域外创建,然后将 Country 对象设为 District 的工厂:
public class Country
{
public District CreateDistrict(string name)
{
return new District(name, this.Id);
}
}
这也将强制客户端在要求它创建地区之前获得一个具体的国家。
我想知道如果 projectId 存在于数据库中,我们是否要检查添加新项目,shell 我们以某种方式在 AddItem
方法中插入 Guard.Agains.NotFound(???)
或不?
我问是因为如果创建一些实体:
public class Country : BaseEntity<int>, IAggregateRoot
{
public string Name { get; private set; }
private readonly List<District> _districts = new List<District>();
public IEnumerable<District> Districts => _districts.AsReadOnly();
public Country(string name)
{
Name = Guard.Against.NullOrEmpty(name, nameof(name));
}
public void AddDistrict(District newDistrict)
{
Guard.Against.Null(newDistrict, nameof(newDistrict));
Guard.Against.NegativeOrZero(newDistrict.CountryId, nameof(newDistrict.CountryId));
_districts.Add(newDistrict);
}
}
public class District : BaseEntity<int>, IAggregateRoot
{
public string Name { get; set; }
public int CountryId { get; set; }
public List<Municipality> Municipalities { get; set; }
}
我们如何验证请求发送的 countryId 是否存在于数据库中? 例如,如果创建集成测试,如:
[Fact]
public async Task AddDistrict()
{
var districtName = "District";
var countryRepository = GetCountryRepository();
var country = new Country("Country");
await countryRepository.AddAsync(country);
var district = new District
{
CountryId = 2,
Name = districtName
};
country.AddDistrict(district);
await countryRepository.UpdateAsync(country);
Assert.Equal(1, district.Id);
}
无论我输入整数值,因为 CountryId 测试都会通过,直到不是 0 或负整数,但我想检查数据库中是否存在该国家/地区实体的 ID。管理此支票的最佳地点在哪里? 此致,
最简单的方法是请求将 Country 对象提供给 District 的构造函数:
public class District
{
public string Name { get; private set; }
public int CountryId { get; private set; }
public District(string name, Country country)
{
if (country == null)
throw new Exception("Missing country.");
Name = name;
CountryId = country.Id
}
}
现在您已强制域的客户端提供国家/地区。如果客户端(应用层)无法根据提供的 id 从 Country 存储库中检索有效的 Country,那么您的构造函数将在获取 null country 时抛出。
或者,将 CountryId 保留为 District 的构造函数参数,将 District 构造函数设为内部,这样它就无法在域外创建,然后将 Country 对象设为 District 的工厂:
public class Country
{
public District CreateDistrict(string name)
{
return new District(name, this.Id);
}
}
这也将强制客户端在要求它创建地区之前获得一个具体的国家。