gpt4 book ai didi

c# - 如何使用依赖于模型属性的接口(interface)设计领域模型

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:46 26 4
gpt4 key购买 nike

我有一个域模型(见下面的示例),它有几个接口(interface),这些接口(interface)是根据模型本身的属性值确定的。虽然下面的代码“有效”,但感觉不对。我确信可能有更好的方法,但我还没有想出一个。我非常有兴趣通过一些替代方法获得反馈。

public interface IPickListGenerator
{
void Execute();
}

public class SportsPicklistGenerator : IPickListGenerator
{
public void Execute()
{
// Do something
}
}

public class EntertainmentPicklistGenerator : IPickListGenerator
{
public void Execute()
{
// Do something
}
}

public interface IQuestionIsAnswerableDeterminer
{
void Execute();
}

public class GameQuestionIsAnswerableDeterminer : IQuestionIsAnswerableDeterminer
{
public void Execute()
{
// Do something
}
}

public class RoundQuestionIsAnswerableDeterminer : IQuestionIsAnswerableDeterminer
{
public void Execute()
{
// Do something
}
}

public class Pool
{
public enum PoolType
{
Sports,
Entertainment
}

public enum DeadlineType
{
Game,
Round
}

private IPickListGenerator mPickListGenerator = null;
private IQuestionIsAnswerableDeterminer mQuestionIsAnswerableDeterminer = null;

public PoolType Type { get; set; }
public DeadlineType Deadline { get; set; }

public IQuestionIsAnswerableDeterminer IsQuestionAnswerableDeterminer
{
get
{
if (mQuestionIsAnswerableDeterminer == null) SetPoolSpecificInterfaces();
return mQuestionIsAnswerableDeterminer;
}
}

public IPickListGenerator PickListGenerator
{
get
{
if (mPickListGenerator == null) SetPoolSpecificInterfaces();
return mPickListGenerator;
}
}

private void SetPoolSpecificInterfaces()
{
switch (Type)
{
case Pool.PoolType.Sports:
mPickListGenerator = new SportsPicklistGenerator();
break;
case Pool.PoolType.Entertainment:
mPickListGenerator = new EntertainmentPicklistGenerator();
break;
}

switch (Deadline)
{
case Pool.DeadlineType.Game:
mQuestionIsAnswerableDeterminer = new GameQuestionIsAnswerableDeterminer();
break;
case Pool.DeadlineType.Round:
mQuestionIsAnswerableDeterminer = new RoundQuestionIsAnswerableDeterminer();
break;
}
}
}
// Example usages:
var pool = new Pool{ Type = Pool.PoolType.Sports, Deadline = Pool.DeadLineType.Game};
pool.IsQuestionAnswerableDeterminer.Execute();
pool.PickListGenerator.Execute();

最佳答案

除了潜在的逻辑不一致(随后设置 TypeDeadline 将导致您的确定器和生成器返回给用户的“不正确”值),我从更大的角度看,设计没有任何问题。这与许多工厂模式的工作方式非常相似:由多个内部具体类实现的外部接口(interface)(或基类),其正确实例由某种区分值确定。

除非构造很昂贵(而且并不总是必要的),否则我建议为 TypeDeadline 设置更智能的属性,以设置适当的接口(interface)实现他们的 set block 中的变量,而不是像现在这样将它们延迟加载到其他属性中。

如果构造 很昂贵,我仍然会切换到 TypeDeadline 的更智能的属性并清除(并进行任何必要的清理up on) 之前可能已经设置的值。

关于c# - 如何使用依赖于模型属性的接口(interface)设计领域模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4771524/

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