让我们假设我有一个包含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;
}
但是可以说我还需要(每bar
和bar
每个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) {...}
public void Remove(Foo f, Bar b) {...}
...
}
稍微好一点,但需要部署的每个POCO的一个整体。
就我个人而言,我并不介意在您的POCO上使用实用方法(即使它们不再是真正的POCO)。另一种选择是创建一个单独的扩展方法库或静态PocoModifier,它是POCO外部的(因此您不是嵌套类),但是可行性取决于您是否将POCO公开给客户端。 – NWard
对我来说,你似乎将业务逻辑拉入你的实体。将业务逻辑写入单独的层。 –
感觉就像你有一套任意的限制,你个人决定强制你的代码...也许如果你想到你为什么这样做,你可以自己决定...注意:你的第一个对象并不是真正不可变的 - 您正在公开列表(需要投射,但是谁将被阻止)并且不显示任何其他方法... –