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

У меня есть три типа условий, которые я ловлю.

  1. Плохой или недостающий вход не должен быть исключением. Используйте и сторону клиента js и сторону сервера regex, чтобы обнаружить, установить атрибуты и передать назад той же странице с сообщениями.

  2. AppException. Это обычно - исключение, которое Вы обнаруживаете и бросаете с в свой код. Другими словами, это, которые Вы ожидаете (файл не существует). Зарегистрируйте его, установите сообщение и передайте назад общей ошибочной странице. Эта страница обычно имеет немного информации о том, что произошло.

  3. непредвиденная исключительная ситуация. Они - те, Вы не знаете о. Зарегистрируйте его с деталями и передайте им общей ошибочной странице.

Hope это помогает

8
задан marc_s 11 August 2009 в 11:08
поделиться

5 ответов

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

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

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

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

2
ответ дан 5 December 2019 в 23:16
поделиться

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

1
ответ дан 5 December 2019 в 23:16
поделиться

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

public class Employee
{
    private int? m_ID;

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

В качестве альтернативы, я думаю, что некоторые фреймворки поддерживают этот тип функциональности (например, я думаю NHibernate позволит вам иметь частный установщик в поле идентификатора).

1
ответ дан 5 December 2019 в 23:16
поделиться

Как насчет:

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

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

0
ответ дан 5 December 2019 в 23:16
поделиться

Вы можете сделать так, чтобы ваш метод 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 сохранить его.

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

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

1
ответ дан 5 December 2019 в 23:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: