Должен ли идентификатор в бизнес-объекте быть только для чтения или нет?

StackOverflow https://stackoverflow.com/questions/1259602

  •  12-09-2019
  •  | 
  •  

Вопрос

На мой взгляд, идентификационное поле бизнес-объекта следует только для чтения (публичный Get и Private Set), поскольку по определению идентификатор никогда не изменится (так как он однозначно идентифицирует запись в базе данных).

Это создает проблему при создании нового объекта (идентификатор еще не установлен), сохраняйте его в базе данных с помощью хранимой процедуры, например, которая возвращает недавно созданный идентификатор, то как вы храните его обратно в объект, если свойство идентификатор прочитано -Только?

Пример:

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

EmployeeDAL.Save(employee);

Как метод сохранения (который фактически подключается к базе данных, чтобы сохранить нового сотрудника) обновляет свойство работника в объекте сотрудника, если это свойство только для чтения (что должно быть так, как работник никогда не будет изменяться, как только оно будет создано).

Похоже, что идентификатор должен быть подлежит написанию DAL и только для чтения для остального мира. Как вы реализуете это, особенно если классы DAL и бизнес -объект находятся в разных собраниях?

Я не хочу создавать метод сохранения в классе сотрудников, так как этот класс не должен иметь никакого отношения к базе данных.

Это было полезно?

Решение

Другое возможное решение- объявить сотрудника:-

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

... при условии, что занятия сотрудников и DAL находятся в одной и той же сборке

Я не утверждаю, что это нравится, но я использовал это.

Другие советы

Вы можете сделать свой метод 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
    }
}

В качестве альтернативы, вы можете сгенерировать новый идентификатор в коде, создать объект с этим идентификатором, а затем попросите ваш DAL сохранить его.

Если вы хотите, чтобы ваш объект был обновлен во время операции сохранения, вам придется обнародовать эту собственность.

Я лично люблю создавать неизменный Объекты, те, которые вы можете настроить только один раз, передавая все значения в конструктор. С этим подходом вы просто создадите объект, который будет сохранен, затем вернете его обратно вместе с назначенным идентификатором из базы данных и вернет его вызывающему абоненту.

Вы можете сделать свой сеттер для идентификатора разрешить установку только в том случае, если он еще не был установлен ранее:

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).

Как насчет того, чтобы позволить коду за пределами 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 может установить его по мере необходимости, но потребляющий код не может.

Как насчет:

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

Это также должно упростить ваш код сохранения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top