0

我想知道如果数据库中存在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 是否存在于数据库中。管理此检查的最佳地点在哪里?问候,

4

1 回答 1

2

最简单的方法是请求提供一个 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);
    }
}

这也将迫使客户在要求创建地区之前获得一个具体的国家。

于 2021-10-12T13:36:28.097 回答