这是我要实现的代码:
- 一个
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,且malus为4,那么他最终将具有1(3 + 1-4 = 0 <1)。
在我的.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
项目。
错误:我想在我的FinalStats
类中添加一个Character
属性。这个FinalStats
应该使用我的EntityStatsBuilder
类。然后,我的datas
项目应该引用我的builders
项目。
public EntityStats FinalStats
{
get
{
EntityStatsBuilder builder = new EntityStatsBuilder();
builder.Add(BaseStats);
builder.Add(RandomStats);
return builder.ToStats();
}
}
我应该如何修改全局体系结构才能不具有这种循环依赖性?
答案 0 :(得分:2)
您要寻找的是所谓的依赖倒置原则https://en.wikipedia.org/wiki/Dependency_inversion_principle
基本上为您的EntityStatsBuilder
创建一个接口,并将其放在单独的项目中。
现在,两个项目都可以引用该接口项目。如果要遵循Microsoft命名约定,则将其命名为SomethingSomething.Abstractions
。
现在,在使用依赖项注入的启动项目中,将具体的EntityStatsBuilder
注入到Character
对象中。为此,您可以根据需要使用DI框架或简单的构造函数注入。