C#最佳实践 - 从BLL设置只读模型属性值

时间:2014-07-30 20:41:47

标签: c# properties model 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 个答案:

答案 0 :(得分:0)

ModelName.Name属性只在_name上指定了一个getter。你无法改变现状。防止对方做同样的事情的唯一方法是通过访问修饰符。

如果Project.BLLProject.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;
}