2015-02-03 3 views
-1

ОригиналКак сделать объект неизменяемого

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

Есть ли какая-либо архитектура, образец, чтобы убедиться в этом. Неизбежно, структурированно, только ничего не так чисто. или я прошу слишком большой формы такого популярного языка?

Под редакцией

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

1.Есть ли какая-либо архитектура, образец, чтобы убедиться в этом. Неизбежный узор, структура, только для чтения ничего нельзя использовать с EF. Я прошу слишком большой формы такого популярного языка?

2. Есть ли способ заблокировать объект после выполнения необходимых изменений?

+9

Частные усадьбы? –

+0

readonly is not clean? – Botonomous

+0

Синглтон дизайн шаблона? –

ответ

6

У вас нет ни одного члена, который мог бы изменять содержимое вашего класса, например, средства определения свойств (сделать сеттеры private).

Не позволяйте методам изменять переменные. (Вы должны сделать их readonly, вероятно).

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

Простой пример:

public class X 
{ 
    public X(string y) 
    { 
     this.y = y; 
    } 

    private readonly string y; 
    public string Y { get { return y; } } 
} 
+3

@ L33TS: если вы инициализируете объект, который не мутирует его на определение. –

+3

Следует отметить, что если ваш класс содержит экземпляры изменяемых объектов, внешний код все равно сможет изменять * те * экземпляры; например, если вашему классу принадлежит экземпляр «List », даже если вы выставляете получателя только своему члену, внешний код все равно сможет изменить этот список. В этом случае вы можете использовать класс-оболочку 'ReadOnlyList ' для создания действительно неизменяемого класса, но если вы подвергаете себя видам, которые сами изменяются, вам может потребоваться создать свои собственные только для чтения. –

+0

@PrestonGuillot: Спасибо. Полезное дополнение! –

-1

Think всех объектов значений, которые вы используете. дата хорошая. Вы можете взять данные класса как часть конструктора и назначить их только один раз при построении. Как уже указывалось, вы можете сделать частные поля свойств частными и доступными для получения. Для функции изменения состояния вы можете вернуть новый экземпляр из метода изменения состояния. Хорошим примером является метод AddDays в DateTime. Это оставляет исходную дату без изменений, но возвращает новую дату с соответствующими днями, добавленными к исходной дате.

Var date = new DateTime(2015,01,01); 
Var newDate = date.AddDays(15); 
// date is now 2015,01,01 
// newDate is now 2015,01,16 

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

0

Ответ для создания Ef объектов неизменны:

Частная собственность наборщиков.

public class Users 
    { 
     public int Id { get;private set; } 
     public string FirstName { get;private set; } 
     public string LastName { get; private set; } 
    } 

Courtse - J. Steen

+0

Это будет работать ... Как вы собираетесь изменить какие-либо свойства? У вас нет конструктора ... –

+0

@PatrickHofman То, что делает свойства неизменными. это действительно понадобится, например, при работе с метаданными, которые нельзя изменять. – Thunder

+0

Но у них не будет значения для начала. –

0

это старый вопрос, но у меня была та же проблема, и придумали следующее решение, оставив его здесь, так что кто-то еще может принести пользу в будущем:

OriginalData = Context.Entry(MyBindingSource.Current).CurrentValues.ToObject(); 

Обратите внимание, что MyBindingSource.Current - это мое сущность.

Смежные вопросы