这是我应该如何建模域类

时间:2011-09-19 08:12:22

标签: oop domain-driven-design

在我的数据库中,我有表tblCountry和tblCity。它们是1:N关系。在我的域项目中,我用City和Country类来表示它们。我真的需要在城市类中使用CountryId还是只需要Country对象?
城市班:

public class City
{
   public int CityId {get;set;}
   public string Name {get;set;}
   public double Longitude {get;set;}
   public double Latitude {get;set;}

   // This confuse me... is this modeled fine?
   public int CountryId {get;set;}
   public Country Country {get;set;}
}

国家/地区

public class Country
{
   public int CountryId {get;set;}
   public string Name {get;set;}
   public IEnumerable<City> Cities {get;set;}
}

我填写像这样的城市对象:

...
   City myCity = GetCityByCityId(cityId);
   myCity.Country = GetCountryByCountryId(myCity.CountryId);

   return myCity;
...

3 个答案:

答案 0 :(得分:1)

在这种情况下,国家是一个聚合根,它应该被所有包含的城市填充,然后你可以简单地获得你想要的国家,并在聚合根中找到城市。

public class City
{
   public int Id {get;set;}
   public string Name {get;set;}
   public double Longitude {get;set;}
   public double Latitude {get;set;}

   public City(Country country)
   { this.Country = country; }
}

public class Country
{
   public int Id {get;set;}
   public string Name {get;set;}
   public IEnumerable<City> Cities {get;set;}
}

...

   Country myCountry = repository.GetCountryByID(xyz); // return a country with all cities filled

   City myCity =  myCountry.Cities.First(c => c.Id = cityId);

   return myCity;

...

根据设计,如果City是聚合根,那么设计将是

public class City
{
   public int Id {get;set;}
   public string Name {get;set;}
   public double Longitude {get;set;}
   public double Latitude {get;set;}
   public Country Country {get;set;}
}

public class Country
{
   public int Id {get;set;}
   public string Name {get;set;}
}

...

   City myCity = repository.GetCityByID(xyz); // return a city with the associated country

   Country myCountry =  myCity.Country;

   return myCity;

...

答案 1 :(得分:1)

  

我真的需要在城市类中使用CountryId还是只需要Country对象?

域名关系是“城市位于国家/地区”。代码应尽可能基于域。您的City类将引用Country对象:

class City {
    private Country _country;
}

你不应该在城市中拥有CountryId,因为它是一种持久性技术性。它应由您的数据访问层(ORM)处理。

答案 2 :(得分:0)

我更喜欢以下内容:

public class City
{
   public int CityId {get;set;}
   public string Name {get;set;}
   public double Longitude {get;set;}
   public double Latitude {get;set;}


   public int CountryId {get;set;}
   public Country Country {get;set;}
public void LoadCountryFromDB()
{
      this.Country = GetCountryByCountryId(this.CountryId);

}
}

有很多数据层生成工具和模型以及代码生成: CSLAGenMyGeneration是ORM工具之一(对象关系映射)。 尝试搜索它们。