C# Лучшие практики - Установите значение свойства модели только для чтения из BLL
Рассмотрим ниже:
public class Project.Model.ModelName : BaseClass
{
private int _id;
private string _name;
public int ID
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
}
}
public class Project.BLL.ModelName
{
public static string ComputeName(Model.ModelName m)
{
// Determine value using complex business logic
return "Whatever";
}
public static bool SetName(Model.ModelName m)
{
string Name = ComputeName(m);
// How can I set the ModelName.Name value here?
m.Name = ??? // No set accessor
}
}
У меня есть модель со строковым свойством, которая имеет только метод доступа get, мы не хотим, чтобы значение устанавливалось напрямую.
Значение для свойства вычисляется в BLL, другой библиотеке.
Каков наилучший способ установить значение свойства без использования отражения?
Для пояснения, проблема заключается в том, что значение Name должно быть неизменным. Одна и та же модель часто доступна и модифицируется. Мы не хотели рисковать тем, кто присваивает ему значение после факта. Я думаю, что я ищу лучшую практику для поддержания неизменности.
1 ответ
ModelName.Name
свойство имеет только геттер, указанный на _name
, Вы никак не можете его изменить, как есть. Единственный способ сделать это, не позволяя другому сделать то же самое, - через модификатор доступа.
Если Project.BLL
а также Project.Model
находится в одной сборке, вы можете использовать internal
модификатор для ограничения доступа из другой сборки. или применить [assembly: InternalsVisibleTo("Project.BLL")]
на Project.Model.ModelName
//1. Add a setter on the property, or :
public string Name
{
get { return _name; }
internal set { _name = value; }
}
//2. Add a setter method for _name :
internal void SetName(string value)
{
_name = value;
}