我只是想知道一些CodeWarning(ConstructorsShouldNotCallBaseClassVirtualMethods),如果有更好的方法来做到这一点.我有一个简单的日志收集器类,我使用NHibernate来检索一些对象.
有时我自己创建对象(当然)并将它们添加到NHibernate中以保持持久性.确保列表永远不为NULL的最佳方法是什么.
目前我这样做,但似乎并不"完美".关于这个话题的任何想法?
public class LogRun
{
public virtual int Id { get; private set; }
public virtual DateTime StartTime { get; set; }
public virtual DateTime EndTime { get; set; }
public virtual IList<Log> LogMessages { get; set; }
public virtual int LogMessageCount { get { return LogMessages.Count; } }
public LogRun()
{
LogMessages = new List<Log>();
}
}
Run Code Online (Sandbox Code Playgroud)
LogMessages是一个持久的东西吗?如果是这样,最好不要公开公共设置者.如果你从数据库中检索出来然后用一个新的IList替换它,那么NHibernate会变得很奇怪:
var myLog = session.Get<LogRun>(1);
Assert.True(myLog.LogMessages.Count > 0);
myLog.LogMessages = new List<Log>();
Run Code Online (Sandbox Code Playgroud)
如果你注意到,NHibernate返回一个代理对象并用通用列表替换它会导致它在你尝试保存时变得不稳定.
作为一项规则,我更喜欢有一个我初始化的私有字段,然后只向客户端公开一个getter:
public class LogRun
{
private IList<Log> logMessages = new List<Log>();
public virtual int Id { get; private set; }
public virtual DateTime StartTime { get; set; }
public virtual DateTime EndTime { get; set; }
public virtual IList<Log> LogMessages { get { return logMessages; } }
public virtual int LogMessageCount { get { return LogMessages.Count; } }
public void AddLogMessage(Log log)
{
logMessages.Add(log);
}
}
Run Code Online (Sandbox Code Playgroud)
实际上,我更进了一步,客户端得到一个IEnumerable <>,我为add添加了一个辅助函数.
我的诽谤看起来像
public class LogRun
{
private IList<Log> logMessages = new List<Log>();
public virtual int Id { get; private set; }
public virtual DateTime StartTime { get; set; }
public virtual DateTime EndTime { get; set; }
public virtual IEnumerable<Log> LogMessages { get { return logMessages; } }
public virtual int LogMessageCount { get { return LogMessages.Count(); } }
public void AddLogMessage(Log log)
{
logMessages.Add(log);
}
}
Run Code Online (Sandbox Code Playgroud)