【发布时间】:2019-03-21 20:43:39
【问题描述】:
这是我想要实现的代码:
Character具有strength、constitution和其他一些统计信息。- 每个
Character都有BaseStats,具体取决于他的班级。- 每个
Character都有RandomStats奖励,正值从0 到3。- 统计数据不得低于 1,也不得高于 10。
Character的统计数据中可能有Bonus和Malus。- 如果
Character在strength中有 8,再加上 4 的红利和 1 的除数,他最终有 10 (8+4-1=11 > 10)。- 如果
Character的体质为 3,加值为 1,正值为 4,则他最终为 1 (3+1-4=0
在我的 .NET 解决方案中,我尝试在不同的项目中分离 datas 和 builders。目前,我的datas 项目中有这样的东西:
namespace Data.Entities.Characters
{
public abstract class Character : Entity
{
public abstract EntityStats BaseStats { get; }
public EntityStats RandomStats { get; }
}
}
namespace Data.Stats
{
public struct EntityStats
{
private Dictionary<EntityStat, int> _stats;
public int this[EntityStat stat] { get { return _stats[stat]; } }
public EntityStats(int strength, int constitution, /* ... */)
{
_stats = new Dictionary<EntityStat, int>();
_stats.Add(EntityStat.Strength, strength);
_stats.Add(EntityStat.Constitution, constitution);
/* ... */
}
}
}
然后,我有一个 builder 和一个 List<EntityStats。
namespace Builder
{
public class EntityStatsBuilder
{
private List<EntityStats> StatsList { get; set; }
public EntityStatsBuilder() { StatsList = new List<EntityStats>(); }
public void Add(EntityStats stats) { StatsList.Add(stats); }
public EntityStats ToStats()
{
int strength = 0,
constitution = 0,
/* ... */;
foreach (EntityStats stats in StatsList)
{
strength += stats[EntityStat.Strength];
constitution += stats[EntityStat.Constitution];
/* ... */
}
// module FMath =
// let Clamp value min max =
// if value < min then min elif value > max then max else value
return new EntityStats(
FMath.Clamp(strength, 1, 10),
FMath.Clamp(constitution, 1, 10),
/* ... */
);
}
}
}
我的问题如下:
我的
builders项目引用了我的datas项目。
错误:我想在我的Character类中添加一个FinalStats属性。这个FinalStats应该使用我的EntityStatsBuilder类。然后,我的datas项目应该引用我的builders项目。
public EntityStats FinalStats
{
get
{
EntityStatsBuilder builder = new EntityStatsBuilder();
builder.Add(BaseStats);
builder.Add(RandomStats);
return builder.ToStats();
}
}
我应该如何修改我的全局架构以避免这种循环依赖?
【问题讨论】:
-
您是否考虑过使用接口并将其放入第三个共享程序集中?
-
我不明白你的建议,你能说得更清楚些吗?谢谢
-
现在你有 Assambly A 和 ClassA,使用来自程序集 B 的 ClassB,而后者又使用来自程序集 A 的 ClassA => 循环依赖。我通常的方法是创建接口并将它们放在共享程序集 C 中,因此您有:程序集 C:IntfA,IntfB,程序集 A:ClassA 使用 IntfB 实现 IntfA,程序集 B:ClassB 使用 IntfA 实现 IntfB,所以程序集 A而 B 只依赖于程序集 C。
标签: c# .net cyclic-dependency