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;
}
Другие вопросы по тегам