C# 强制不同对象之间的数据完整性

C# 强制不同对象之间的数据完整性,c#,oop,class,integration,C#,Oop,Class,Integration,我正在通过开发一个C#音乐管理软件来学习OOP。到目前为止,我已经展示了不同类和对象之间的交互,如类图所示 然而,我很困惑如何使我的设计坚实,因为我发现了无数的可能性,如何可以做的事情,但我不想以一个糟糕的设计结束。我面临的主要问题是确保在不同对象之间强制执行数据完整性(据我所知,我假设在OOP中,就像在数据库设计中一样,有一种方法可以提供不同对象中数据存储的准确性、一致性和可靠性,就像在数据库设计中一样(例如,外键约束的使用)。例如,在我的应用程序中,我有艺术家、歌曲和专辑对象,它们应该一起交

我正在通过开发一个C#音乐管理软件来学习OOP。到目前为止,我已经展示了不同类和对象之间的交互,如类图所示

然而,我很困惑如何使我的设计坚实,因为我发现了无数的可能性,如何可以做的事情,但我不想以一个糟糕的设计结束。我面临的主要问题是确保在不同对象之间强制执行数据完整性(据我所知,我假设在OOP中,就像在数据库设计中一样,有一种方法可以提供不同对象中数据存储的准确性、一致性和可靠性,就像在数据库设计中一样(例如,外键约束的使用)。例如,在我的应用程序中,我有艺术家、歌曲和专辑对象,它们应该一起交互。例如,我不想让一首歌曲错误地与错误的专辑关联。我被告知我应该执行以下操作:

class Album
{
  public String Name{ get; set;}

  List<Track> tracks;

  public void AddTrack(Track t)
  {
    tracks.Add(t);
    t.Album = this;
  }
} 
class Track
{
  public Album Album{ get; set;}
  public String AlbumName
  { 
    get{ return this.Album.Name}
  }

  public String ArtistName{ get; set}
}
类相册
{
公共字符串名称{get;set;}
列出曲目;
公共轨道(t轨道)
{
增加(t);
t、 相册=这个;
}
} 
班级轨道
{
公共相册相册{get;set;}
公共字符串名称
{ 
获取{返回this.Album.Name}
}
公共字符串ArtistName{get;set}
}
但是,这对我来说不起作用。有人能建议我如何真正做到这一点吗?特别是,我如何添加一首带有标题、专辑和艺术家的新歌,并确保如果由于某种奇怪的原因更改了专辑的名称,所有曲目仍将返回正确的专辑名称,因为它们从al获取数据自焚


还有,有人能推荐一个更好的设计吗?我应该使用继承或任何多态性来使我的设计更健壮吗?

在DB design中,您必须根据您的业务需求做出选择。意思是: 你必须问自己关于可能的星座的问题 -CD上的所有歌曲都来自同一位艺术家吗?否->歌手场在轨道上,是->专辑上的歌手场 -当你知道一首歌时,你是否必须能够得到专辑,或者仅仅是一张特定专辑中的所有曲目 -

从Track对象引用被引用唱片集的名称的方式来看,您所做的是正确的。值得一提的是:它们确实返回唱片集名称,但仅返回唱片集在获取时的名称。 因此,如果将AlbumName属性指定给可视控件或其他任何控件,则在更改Albums名称时,该属性不会自动更新


如果这不是您想要听到的,请询问更具体的问题。

在DB design中,您必须根据业务需求做出选择。意思是: 你必须问自己关于可能的星座的问题 -CD上的所有歌曲都来自同一位艺术家吗?否->歌手场在轨道上,是->专辑上的歌手场 -当你知道一首歌时,你是否必须能够得到专辑,或者仅仅是一张特定专辑中的所有曲目 -

从Track对象引用被引用唱片集的名称的方式来看,您所做的是正确的。值得一提的是:它们确实返回唱片集名称,但仅返回唱片集在获取时的名称。 因此,如果将AlbumName属性指定给可视控件或其他任何控件,则在更改Albums名称时,该属性不会自动更新


如果这不是你想听到的,那就问得更具体些。

事实上,你没有做关联

在面向对象编程中,您关联对象而不是“键”。没有“外键”的概念

如果对象B具有父对象a,且a具有唯一标识符,则不会通过设置此唯一标识符来关联B的父对象,而是对象本身:

B有父母a:

以这种方式工作,因为“的实例”可能与许多其他对象关联,从任何引用更改同一对象,将导致修改该对象

如何实现完整性约束?有一些设计模式,但最常见的模式之一是规范

这就创建了一个公共接口“isSpecification”,它有一个方法,可以称为“Check”,它接受一个参数(要检查规范的对象)。在实现中,该方法将检查某个对象是否符合某个规范

public interface ISpecification { bool Check(object some); }

public class Person { public string Name { get; set; } }

public class PersonSpecification : ISpecification
{
     public bool Check(object some) 
     {
          // Checks that some person won't be null and his/her name isn't null or empty
          return some != null && !string.IsNullOrEmpty(((Person)some).Name);
     }
} 
这是一个关于如何实现业务规则和/或约束的非常简单和通用的示例

在这方面,有许多框架可以帮助您:

  • Microsoft模式与实践验证块:

  • NHibernate验证器:(它是NHibernate项目的一部分,但是它可以在没有NHibernate的情况下独立使用)

在一些项目中,我集成了NHibernate Validator,而在其他项目中,我集成了一个基于规范模式的定制解决方案,但集成方式比示例更复杂、更灵活

关于规格模式:


事实上,你没有做关联

在面向对象编程中,您关联对象而不是“键”。没有“外键”的概念

如果对象B具有父对象a,且a具有唯一标识符,则不会通过设置此唯一标识符来关联B的父对象,而是对象本身:

B有父母a:

以这种方式工作,因为“的实例”可能与许多其他对象关联,从任何引用更改同一对象,将导致修改该对象

如何实现完整性约束?有一些设计模式,但最常见的模式之一是规范

这就创建了一个公共接口“isSpecification”,它有一个方法,可以称为“Check”,它接受一个参数(要检查规范的对象)。在实现中,该方法将检查某个对象是否符合某个规范

public interface ISpecification { bool Check(object some); }

public class Person { public string Name { get; set; } }

public class PersonSpecification : ISpecification
{
     public bool Check(object some) 
     {
          // Checks that some person won't be null and his/her name isn't null or empty
          return some != null && !string.IsNullOrEmpty(((Person)some).Name);
     }
} 
这是一个非常简单和通用的示例,介绍了如何实现businessr