良好的课堂设计

Mar*_*son 25 c# c#-4.0

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

这是我的示例代码:

namespace BusinessLayer
{
    class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime DateOfBirth { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

或者像这样:

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

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

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

public int Save()
{
    int personId;
    personId = DatabaseComponent.InsertPerson(FirstName, LastName, DateOfBirth);
    return personId;
}
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*one 19

首先,我将两个不同的公共构造函数放到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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许你写两个

var p = new Person("Marilyin", "Manson");
var p2 = new Person("Alice", "Cooper", new DateTime(...));
Run Code Online (Sandbox Code Playgroud)

var p = new Person { FirstName="Marilyn", LastName="Manson" };
Run Code Online (Sandbox Code Playgroud)

我不明白你为什么要限制只有一种形式.

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

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

你不打算顺便使用ORM吗?

  • "Marylin Manson"和"Alice Cooper"的+1:P (9认同)

Dar*_*rov 12

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

var person1 = new Person
{
    FirstName = "Kate";
    LastName = "Middleton";
};
Run Code Online (Sandbox Code Playgroud)

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

public int Save(Person person) 
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

var person1 = new Person
{
    FirstName = "Kate";
    LastName = "Middleton";
};
var id = new PersonsRepository().Save(person1);
Run Code Online (Sandbox Code Playgroud)

  • 拥有构造函数(然后没有默认值)的优点是必须初始化属性. (7认同)

jga*_*fin 5

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

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

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

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

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

看看PetaPoco一个轻量级的替代或NHibernate的一个功能更完整的备选方案.

验证

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