【问题标题】:Hiding property setters while using an OR Mapper使用 OR 映射器时隐藏属性设置器
【发布时间】:2016-07-08 02:08:38
【问题描述】:

我正在使用 Fluent-NHibernate 来管理所有的数据持久层,我总体上非常高兴(并感谢 NHibernate 社区)。我计划继续使用 OR 映射器。我围绕正在映射的 POCO 开发了一个 API。缺点是 UI 开发人员可以获取和设置所有属性。当我真正想要的是隐藏非中间层开发的属性并且只显示提供的 API 方法来执行操作时。

有人对此有好的策略吗?

过于简单的例子:

member.FName = "Julian";    /// Don't do this because it avoids the my checking
member.LName = "King";


member.setName("Julian", "King");   /// Yes - this will throw an error if this person already exist 

【问题讨论】:

  • public setter 和 public operation 有什么区别?两者都产生相同的结果。也许你想让你的类型不可变
  • 操作是指方法吗?您是否建议使用方法而不是属性?
  • 是的。不。听起来您想要不可变类型,在这种情况下,您会将所有内容都传递给构造函数。因此将没有设置器或方法来更改状态。
  • 说实话,我只是想从自动完成中隐藏一些公共属性。那可能有 99% 的效率。
  • 同班同学不能这样。您可以通过说没有设置器的 UI 层来创建一个共享状态的第二类

标签: c# asp.net .net nhibernate fluent-nhibernate


【解决方案1】:
private string _fName;
public string FName
{
   get { return _fName;}
}

private string _lName;
public string LName
{
  get { return _lName;}
}

public void SetName(string fName, string lName){

   // check for nulls here and or validate pre-conditions

  _fName = fName;
  _ lName = lName;

// check for post conditions here

}

或者更好的是使用值对象(参见 DDD 中值对象的定义)

public void SetName(Name name){

      _fName = name.FirstName;
      _ lName = name.LastName;

    }

【讨论】:

  • 感谢您的回复。您是正确的,这将保护数据属性并强制使用该函数来设置名称。但是,也许我没有说清楚,我使用的是 OR 映射器 Fluent NHibernate,因此拥有私有或根本没有设置器会引发映射错误。
  • 您可能想多了解一下 NH。您可以映射到私有字段列。我一直这样做。
  • 您甚至可以将它指定为所有类的对流或逐个案例的bassis。 DefaultAccess.ReadOnlyPropertyThroughCamelCaseField(CamelCasePrefix.Underscore);
  • 你是对的。我尝试使用私有设置器进行映射,但 Nhibernate 抛出了一个错误。那时我认为这不是不受支持的东西。谢谢你的纠正。我会投票给这个作为正确答案。
  • 分享官方 Fluent NHibernate 文档:github.com/jagregory/fluent-nhibernate/wiki/…
猜你喜欢
  • 2021-02-27
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
相关资源
最近更新 更多