您好我正在努力改進/重構一個領域模型,並試圖將邏輯從應用程序服務移動到我的領域模型。現在我陷入了一個NHibernate問題。流利Nhibernate映射 - 價值對象內的一對多?
該模型是一個WorkEvaluation類,它包含一個包含Question的Questionaire模板,它還包含一個QuestionWeight類的集合。問題在於WorkEvaluation類也有一個重要的屬性,它屬於WorkEvaluation中的QuestionWeight集合。這個概念是你通過回答很多問題來進行評估(在這個例子中不包括anserws),最後你應用一些修改答案分數的權重(百分比權重)。這意味着你可以提出一些更重要的問題和其他不太重要的問題。命中間隔也是您在計算TOTAL WorkEvaluation得分(包括權重修改)時使用的調整參數,結果爲例如:Totalscore = 100,Hitinterval 5%比我們得到95-105的總區間並可用於匹配其他評估。
足夠的背景。 我想將QuestionWeights和HitInterval的列表封裝在一個Value對象QuestionScoreTuning中,因爲它們屬於一起並且應該同時應用。 而且我還希望將一些業務邏輯添加到不屬於workEvaluation的QuestionScoreTuning中。 我如何映射我的流利Nhibernate價值對象(組件)具有一對多的集合和HitInterval和參考回來?這是我當前的代碼:
public class WorkEvaluation : DomainBase<long>, IAggregateRoot
{
public void ApplyTuning(QuestionScoreTuning tuning)
{
QuestionScoreTuning = tuning;
//TODO Raise Domain Event WorkEvaluationCompleted -
// which should recalculate all group scores
}
public QuestionScoreTuning QuestionScoreTuning { get; protected set; }
}
public class QuestionScoreTuning : ValueObject
{
private IList<QuestionWeight> _questionWeights;
public QuestionScoreTuning(IList<QuestionWeight> listOfWeights, long hitInterval)
{
_questionWeights = listOfWeights;
HitInterval = hitInterval;
}
public long HitInterval { get; protected set; }
protected override IEnumerable<object> GetAtomicValues()
{
return _questionWeights.Cast<object>();
}
/// <summary>
/// A list of all added QuestionWeights for this WorkEvaluation
/// </summary>
public IList<QuestionWeight> QuestionWeights
{
get { return new List<QuestionWeight>(_questionWeights); }
protected set { _questionWeights = value; }
}
protected QuestionScoreTuning()
{}
}
public class QuestionWeight : DomainBase<long>, IAggregateRoot
{
public QuestionWeight(Question question, WorkEvaluation evaluation)
{
Question = question;
WorkEvaluation = evaluation;
}
public Weight Weight { get; set; }
public Question Question { get; protected set; }
public WorkEvaluation WorkEvaluation { get; protected set; }
public override int GetHashCode()
{
return (Question.GetHashCode() + "|" + Weight).GetHashCode();
}
protected QuestionWeight()
{}
}
流利的映射:
public class WorkEvaluationMapping : ClassMap<WorkEvaluation>
{
public WorkEvaluationMapping()
{
Id(x => x.ID).GeneratedBy.Identity();
References(x => x.SalaryReview).Not.Nullable();
References(x => x.WorkEvaluationTemplate).Column("WorkEvaluationTemplate_Id").Not.Nullable();
Component(x => x.QuestionScoreTuning, m =>
{
m.Map(x => x.HitInterval, "HitInterval");
m.HasMany(x => x.QuestionWeights).KeyColumn("WorkEvaluation_id").Cascade.All();
});
}
}
public class QuestionWeightMapping : ClassMap<QuestionWeight>
{
public QuestionWeightMapping()
{
Not.LazyLoad();
Id(x => x.ID).GeneratedBy.Identity();
Component(x => x.Weight, m =>
{
m.Map(x => x.Value, "WeightValue");
m.Map(x => x.TypeOfWeight, "WeightType");
});
References(x => x.Question).Column("Question_id").Not.Nullable().UniqueKey(
"One_Weight_Per_Question_And_WorkEvaluation");
References(x => x.WorkEvaluation).Column("WorkEvaluation_id").Not.Nullable().UniqueKey(
"One_Weight_Per_Question_And_WorkEvaluation");
}
}
我所要完成的任務是QuestionWeights和HitInterval的集合移動到一個值對象(組件映射),因爲這些仍然會裏數據庫表WorkEvaluation。
P.S我看了一些示例解決方案DDDSample.net(埃裏克埃文斯DDD在c#中的例子),他們完成了這與行列類,它採取列表作爲ctor參數,並被映射爲一個貨運組件。區別在於該示例有一個valueobjects的列表,而Leg Leg具有對實體類的位置的引用。
希望也許有人知道如何做到這一點。在此先感謝... /Bacce