我正在尝试重构一个解决方案以引入另一个项目。 我有一个Core项目,其中包含项目中的公共类。
我试图通过使用2个想象的项目来简化我的问题:假期和天气......
我有一个Holidays项目的文件加载过程设置,它有以下两个类:
public class Job
{
public virtual string CreatedBy { get; set; }
public virtual DateTime? CreatedDate { get; set; }
public virtual Security Security { get; set; }
protected IList<File> _files = new List<File>();
public virtual IEnumerable<File> Files
{
get { return _files; }
}
}
public class File
{
public virtual string FileName { get; set; }
public virtual FileType FileType { get; set; }
public virtual FileStatusType FileStatusType { get; set; }
public virtual Job Job { get; set; }
}
Weather项目的文件加载过程与Holidays完全相同,只是Jobs类没有Security属性。
我的问题是,是否有可能以某种方式将两个类移动到Core项目中以允许两个项目都使用它们? 显然Weather不需要Security属性,所以我想我会有一个没有安全性的Core.Job类,然后在Holidays.Job中扩展Core.Job。
但是一旦我这样做,在Core.File类中,它指的是什么Job?因为它位于Core项目中,所以它必须是Core.Job。 那么我是否需要将Job和File放在Holidays中,Weather(以及任何其他未来的项目)使用Core.Job和Core.File?
我不希望Core项目对子项目有任何引用。
我正在使用NHibernate,因此有映射文件 - 增加了复杂性。
希望这很清楚
由于
答案 0 :(得分:2)
你当然可以这样做,但我不确定它是否会给你带来真正的好处:
Job
一起使用?如果没有,在每个项目中单独实施Job
可能会帮助您保持松耦合,即使我有点多余。在我写的代码中,我有时通过提取接口而不添加真正的好处来引入不必要的依赖。这就是我有点谨慎的原因。Job
的部分可能就是它所使用的界面。Security
可能在语义上属于另一个接口。此外,您将对类的控制权移交给Core
。答案 1 :(得分:1)
不清楚为什么会混淆你提供的解决方案(假设我理解你)
//Core DLL
public class Job
{
public virtual string CreatedBy { get; set; }
public virtual DateTime? CreatedDate { get; set; }
protected IList<File> _files = new List<File>();
public virtual IEnumerable<File> Files
{
get { return _files; }
}
}
在 Hollidays 中
public class HollidayJob : Job
{
public virtual Security Security { get; set; }
}
天气中的只需使用类型Job
,如果它自给自足的话。
在这种情况下,请参考CoreDLL
项目Holliday
和Weather
。当您通过NHibernate
对其进行序列化时,HollidayJob
会更多地保存一个字段,但当Weather
读取同一个表时,它会跳过该字段,因为什么都不知道,实际上并不知道关心它。
希望这有帮助。