【问题标题】:C# Best practices - Set readonly model property value from BLLC# 最佳实践 - 从 BLL 设置只读模型属性值
【发布时间】:2014-09-22 16:03:18
【问题描述】:

考虑以下:

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 值需要是不可变的。经常访问和修改相同的模型。我们不想冒险有人在事后为其赋值。我想我正在寻找一种保持不变性的最佳实践。

【问题讨论】:

  • 如现在所示,绝对没有办法在没有反射的情况下设置这个_name 字段。您需要解释您可以/不能更改的内容,以便建议不同的选项。
  • 您必须使该属性具有设置器。如果 BLL 需要修改它,那么模型需要暴露它。
  • @AlexeiLevenkov 请查看关于不变性的编辑。
  • “如何修改不可变值”对我来说没有多大意义。考虑阅读 Eric Lippert 的 Kinds of Immutability,这样您就可以阐明“不可变”在您的案例中的含义。

标签: c# properties model bll


【解决方案1】:

ModelName.Name 属性仅在 _name 上指定了一个 getter。你不可能改变它的原样。在防止其他人这样做的同时,唯一的方法是通过访问修饰符。

如果Project.BLL 和Project.Model 在同一个程序集中,您可以使用internal 修饰符来限制来自其他程序集的访问。或在Project.Model.ModelName 上应用[assembly: InternalsVisibleTo("Project.BLL")]

 //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;
}

【讨论】:

  • 我最终使用了这个通用解决方案。该值在最初设置后需要是不可变的。我使用了一个内部集,它允许将值从 DAL 加载到模型中,并使用一个内部 void 来设置 BLL 中的值。 InternalsVisibleTo 用于 BLL 和 DAL 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2020-05-05
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多