gpt4 book ai didi

c# - NHibernate 中不同类型答案的问题

转载 作者:行者123 更新时间:2023-11-30 21:20:33 25 4
gpt4 key购买 nike

我正在尝试为问卷问题找到一个简洁的解决方案。假设我有一个 Questionnaire 类,它有一个 Answer 的集合,例如

public class Questionnaire
{
public virtual ISet<Answer> Answers {get;set;}
}

答案需要根据问题采用不同的类型,例如出生日期、满分 10 分、你认为为什么等等。

我的第一个想法是这样的:

public class Question
{
public virtual QuestionType TypeOfQuestion {get;set;}
public virtual string PromptText {get;set;}
}

public class Answer
{
public virtual Question Question {get;set;}
}

public class DateTimeAnswer : Answer
{
public virtual DateTime Response {get;set;}
}

public class IntegerAnswer : Answer
{
public virtual int Response {get;set;}
}
// etc.

明显的问题是,从问卷中,无法访问 Response 属性:

questionnaire.Answers[0].Response; // compile error

这同样适用于接口(interface)。使用通用接口(interface)会更好,例如:

public interface IAnswer<T> 
{
public virtual Question Question {get;set;}
public virtual T Response {get;set;}
}

public class DateTimeAnswer : IAnswer<DateTime> {}

然后问题出现在 Questionnaire 类中,因为必须提供 IAnswer 的类型:

public class Questionnaire
{
public virtual ISet<IAnswer<???>> Answers {get;set;}
}

很明显,我不希望有许多不同类型的 IAnswer 集合。我可以用

ISet<IAnswer<dynamic>> 

但是 NHibernate 不喜欢它。

我意识到某处需要妥协,但我不确定哪个是最漂亮的。你会怎么做?

最佳答案

我认为将 Question 和 answer 子类化是一个很好的计划 - 摆脱 QuestionType 枚举。

然后你可以在 Question 上有一个 MakeAnswer(string) 抽象方法,它为你封装了很多逻辑,并且可以在必要时进行类型转换等。

我对 Rob's answer 上的一般问题的解决方案会是这样的:

public interface IAnswer
{
Question Question { get; }
void Respond(IAnswerFormatter formatter);
}

IAnswerFormatter 看起来像这样:

public interface IAnswerFormatter
{
void Format(string value);
void Format(DateTime value);
...
}

DateTimeAnswer 看起来像这样:

public class DateTimeAnswer : IAnswer
{
public DateTimeAnswer(Question question, DateTime value)
{
Question = question;
}
public Question Question { get; protected set; }

protected DateTime Response {get; set;}

public virtual void Respond(IAnswerFormatter formatter)
{
formatter.Write(Response);
}
}

DateTimeQuestion 可能看起来像:

public class DateTimeQuestion : Question
{
public IAnswer MakeAnswer(string value)
{
// Ignoring error handling here
return new DateTimeAnswer(this, DateTime.Parse(value));
}
}

通过这种方式,您的答案可以以自己的方式保存值,并且您的 NH 映射可以指定它在数据库中的外观(我建议使用鉴别器进行映射),您的问题可以负责从通用响应中创建答案。

关于c# - NHibernate 中不同类型答案的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3232363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com