8

在我看来,业务对象的 ID 字段应该是只读的(公共获取和私有集),因为根据定义,ID 永远不会改变(因为它唯一地标识了数据库中的一条记录)。

当您创建一个新对象(尚未设置 ID)时,这会产生一个问题,例如通过一个存储过程将其保存在数据库中,该过程返回新创建的 ID,那么如果读取了 ID 属性,您如何将其存储回对象中-只要?

例子:

Employee employee = new Employee();  
employee.FirstName="John";  
employee.LastName="Smith";  

EmployeeDAL.Save(employee);

如果该属性是只读的,Save 方法(实际上连接到数据库以保存新员工)如何更新 Employee 对象中的 EmployeeId 属性(这应该是因为一旦创建,EmployeeId 就永远不会改变)。

看起来 Id 应该可以由 DAL 写入,并且对于世界其他地方是只读的。如果 DAL 类和业务对象类位于不同的程序集中,您将如何实现这一点?

我不想在 Employee 类中创建 Save 方法,因为这个类应该与数据库无关。

4

5 回答 5

2

另一种可能的解决方案是将 Employee 声明为:-

public class Employee
{
    public int Id { get; internal set; }
}

...前提是 Employee 和 DAL 类在同一个程序集中,

我不声称喜欢它,但我已经使用了它。

于 2009-08-11T11:30:26.867 回答
1

只允许 DAL 外部的代码通过不为 Id 字段(和任何其他不可变字段)提供设置器的接口引用对象怎么样:

public interface IEmployee
{
    Int32 Id {get;}
    String Name {get;set;}
    // ... and so on ...
}

public class Employee: IEmployee
{
    Int32 Id {get;set;}
    String Name {get;set;}
}

DAL 可以根据需要进行设置,但消费代码不能。

于 2009-08-11T11:53:51.703 回答
1

你可以让你的 DAL 方法只返回一个更新的对象:

public class EmployeeDAL
{
    Employee EmployeeDAL.Save (Employee employee)
    {
        // Save employee
        // Get the newly generated ID
        // Recreate the object with the new ID and return it
    }
}

或者,您可以在代码中生成一个新 ID,使用此 ID 实例化一个对象,然后让您的 DAL 保存它。

如果您希望在保存操作期间更新您的对象,则必须公开此属性。

我个人喜欢创建不可变对象,这些对象只能通过将所有值传递给构造函数来设置一次。使用这种方法,您只需创建一个要保存的对象,然后从数据库中检索它以及分配的 ID 并将其返回给调用者。

于 2009-08-11T10:55:59.357 回答
1

只有在之前尚未设置过的情况下,您才可以设置 ID 允许设置:

public class Employee
{
    private int? m_ID;

    public int? ID
    {
        get { return m_ID; }
        set
        {
            if (m_ID.HasValue())
                throw ...
            m_ID = value;
        }
    }
}

或者,我认为某些框架支持这种类型的功能(例如,我认为 NHibernate 将允许您在 ID 字段上使用私有设置器)。

于 2009-08-11T10:56:39.277 回答
0

怎么样:

Employee employee = new Employee(EmployeeDAL.GetNextID());

这也应该使您的保存代码更简单。

于 2009-08-11T10:54:58.327 回答