良好的课堂设计

我正在尝试找出设计一个其属性保存在数据库中的类的最佳方法。 我们来看一个Person的基本例子。 要创建一个新人并将其放在数据库中,我希望DateOfBirth属性是可选的(即在DB中为NULL)。

这是我的示例代码:

 namespace BusinessLayer { class Person { public string FirstName { get; set; } public string LastName { get; set; } public DateTime DateOfBirth { get; set; } } } 

我不确定这些领域是否应公开。 我应该这样做:

 class Program { static void Main(string[] args) { Person person1 = new Person("Kate","Middleton",null); } } 

或者像这样:

 class Program { static void Main(string[] args) { Person person1 = new Person(); person1.FirstName = "Kate"; person1.LastName = "Middleton"; } } 

我也想知道我应该如何处理类的可选属性。 填写完字段后,如何将其保存到数据库中? 我有一个DatabaseComponenet类来保存信息。 保存到数据库时如何处理可选项?

那么,我会做这样的事情:

 public int Save() { int personId; personId = DatabaseComponent.InsertPerson(FirstName, LastName, DateOfBirth); return personId; } 

谢谢你的帮助! 关于良好class级设计的一些有用的URL也将受到赞赏。

首先,我将两个不同的公共构造函数放到Person:

 namespace BusinessLayer { class Person { public Person(string firstName, string lastName): this(firstName, lastName, DateTime.Now) {} public Person(string firstName, string lastName, DateTime birthDate) { FirstName = firstName; LastName = lastName; DateOfBirth = birthDate; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime DateOfBirth { get; set; } } } 

这允许你写两个

 var p = new Person("Marilyin", "Manson"); var p2 = new Person("Alice", "Cooper", new DateTime(...)); 

 var p = new Person { FirstName="Marilyn", LastName="Manson" }; 

我不明白你为什么要限制只有一种forms。

对于DatabaseComponent,我强烈建议编写一个方法,允许您保存Person而不是隐式声明的签名。

这是因为,如果有一天改变了Person的定义方式,你可能不得不在调用Save()方法的每个点上更改代码。 通过只保存一个Person,您只需要更改Save()实现。

你打算不打算使用ORM吗?

使用C#3.0类初始化程序,我不再需要提供允许我初始化所有属性的构造函数:

 var person1 = new Person { FirstName = "Kate"; LastName = "Middleton"; }; 

Save方法而言,我通常将它们放在一个单独的存储库类中:

 public int Save(Person person) { ... } 

然后当我需要拯救一个人时:

 var person1 = new Person { FirstName = "Kate"; LastName = "Middleton"; }; var id = new PersonsRepository().Save(person1); 

如果某些字段是必填字段,则仅使用构造函数,因为它是确保指定这些字段的有效方法。

我不确定这些领域是否应公开

字段通常表示成员变量,而这些变量应始终是私有的。 至于属性,我会坚持使用get / set作为数据库对象。

我也想知道我应该如何处理类的可选属性。 填写完字段后,如何将其保存到数据库中?

将内容保存到数据库是一个完全不同的故事。 我不会尝试创建自己的图层,而是使用现有的图层。 有一整套不同的ORM:从非常简单到function完备。

看看PetaPoco的轻量级替代品或nHibernate ,以获得更多function完整的替代品。

validation

确保正确指定必需字段并获得有效值的一种常用方法是使用validation框架。 内置于.net中的一个名为DataAnnotations 。 谷歌,看看一些例子。

应使用业务规则检查。

我的意思是,如果你想要一个非常可重复使用的商业模式,业务对象应该在不同领域的其他地方重新使用,这可能意味着在某些业务中,同一类“A”在状态“X”中可能没问题,但在另一种情况下,同一个class级“A”,在“Y”状态下会很好。

有一个很好的设计模式,允许您实现名为规范的业务validation器:

这可以通过很多方式实现,但最紧凑的方法之一是使用lambda表达式构建规则。

例如:

 someAInstance => someAInstance.Name != null && someAInstance.Age > 30 

另一种方法是使用现有的对象validation库,比如NHibernate Validator,它可以在没有NHibernate的情况下独立使用,并允许你将属性放在类的属性中,如[NotNull][NotNullNotEmpty]和更复杂的规则,你可以使用内置的 – 或者你可以建立自己的。

通过阅读本文了解更多信息(在那里您可以找到开箱即用的validation规则列表)

请注意,NH Validator最重要的优势之一是它可以在任何层使用,不仅可以在数据或业务层使用,而且可以在没有NHibernate的情况下使用它,你的重量轻,易于使用且多 – 分层对象validation器。