加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – POCO和实用方法

发布时间:2020-12-15 18:06:20 所属栏目:百科 来源:网络整理
导读:让我们假设我有一个包含foos和bars的POCO类: public class Poco { public IEnumerableFoo Foos { get { return foos; } } public IEnumerableBar Bars { get { return bars; } } private ListFoo foos; private ListBar bars;} 在我的例子中,我需要能够添加
让我们假设我有一个包含foos和bars的POCO类:
public class Poco {
  public IEnumerable<Foo> Foos { get { return foos; } }
  public IEnumerable<Bar> Bars { get { return bars; } }

  private List<Foo> foos;
  private List<Bar> bars;
}

在我的例子中,我需要能够添加和删除foos和bars:

public class Poco {
  public IList<Foo> Foos { get { return foos; } }
  public IList<Bar> Bars { get { return bars; } }

  private List<Foo> foos;
  private List<Bar> bars;
}

但是我要说我还需要(任意)约束,每个条形图必须有一个foo,每个foo也必须有一个条形图.

public class NotAPocoAnyMore {
  public IEnumerable<Foo> Foos { get { return foos; } }
  public IEnumerable<Bar> Bars { get { return bars; } }

  private List<Foo> foos;
  private List<Bar> bars;

  public void Add(Foo f,Bar b) {...}
  public void Remove(Foo f,Bar b) {...}
}

我的问题是:我是否正在努力保持POCO简单而不给它任何实用方法?第一个例子POCO很好,因为它是不可变的,POCO还有其他优点.但是,我无法看到一种方法来保持类POCO,并仍然有办法以受控方式访问和修改内容(至少不是一种似乎没有过度杀死的方式).

有人认为我有:

嵌套修改类

public class Poco {
  public IEnumerable<Foo> Foos { get { return foos; } }
  public IEnumerable<Bar> Bars { get { return bars; } }
  public PocoModifier Modifier { get { ... } }

  private List<Foo> foos;
  private List<Bar> bars;

  public class PocoModifier {
    private readonly Poco toModify;
    public void Add(Foo f,Bar b) {...}
    public void Remove(Foo f,Bar b) {...}
    ...
  }
}

公共嵌套类?不用了,谢谢!它实际上只是与非POCO类相同,只是更多的嵌套.

使用访问修饰符

public class Poco {
  public IEnumerable<Foo> Foos { get { return foos; } }
  public IEnumerable<Bar> Bars { get { return bars; } }
  public PocoModifier Modifier { get { ... } }

  internal List<Foo> foos;
  internal List<Bar> bars;
}

public class PocoModifier {
  private readonly Poco toModify;
  public void Add(Foo f,Bar b) {...}
  ...
}

稍微好一些,但每个POCO需要一个完整的部署单元.

解决方法

听起来你的数据会更好地通过将Foo与Bar配对的东西来建模.
public class Poco {
  public IList<Tuple<Foo,Bar>> FooBars { get { return fooBars; } }

  private List<Tuple<Foo,Bar>> fooBars;
}

除非出于某些奇怪的原因,Foos和Bars完全分开,除非要求它们的计数相同.然后我喜欢你的第三个例子……

public class NotAPocoAnyMore {
  public IEnumerable<Foo> Foos { get { return foos; } }
  public IEnumerable<Bar> Bars { get { return bars; } }

  private List<Foo> foos;
  private List<Bar> bars;

  public void Add(Foo f,Bar b) {...}
}

在我看来,PocoModifier增加了不必要的复杂性.嵌套类通常不应该是公共的(所以如果你有类,那么就像在上一个例子中那样分开).

如果你需要一个POCO也可以使用(比如公开给那些使用你的代码作为库的人,同时保持其他逻辑内部),你可以创建一个普通的POCO,然后用AutoMapper(或类似的)将它映射到NotAPocoAnyMore .

public class Poco {
  public IList<Foo> Foos { get; set; }
  public IList<Bar> Bars { get; set; }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读