数据项目和构建者项目之间的循环依赖

时间:2018-10-17 08:21:20

标签: c# .net cyclic-dependency

这是我要实现的代码:

  
      
  • 一个Character具有strengthconstitution和其他一些统计信息。
  •   
  • 每个Character都有BaseStats,具体取决于其班级。
  •   
  • 每个Character的奖金为RandomStats,其正值从0到3。
  •   
  • 统计信息不得低于1,也不得高于10。
  •   
  • Character的统计信息中可能包含BonusMalus
  •   
  • 如果一个Characterstrength中有8个,加上红利4和一个骗子1,那么他最终有10个(8 + 4-1 = 11> 10)。
  •   
  • 如果一个Character的体质为3,加分为1,且malus为4,那么他最终将具有1(3 + 1-4 = 0 <1)。
  •   

在我的.NET解决方案中,我尝试将datasbuilders分开在不同的项目中。目前,我的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();
    }
}

我应该如何修改全局体系结构才能不具有这种循环依赖性?

1 个答案:

答案 0 :(得分:2)

您要寻找的是所谓的依赖倒置原则https://en.wikipedia.org/wiki/Dependency_inversion_principle

基本上为您的EntityStatsBuilder创建一个接口,并将其放在单独的项目中。 现在,两个项目都可以引用该接口项目。如果要遵循Microsoft命名约定,则将其命名为SomethingSomething.Abstractions

现在,在使用依赖项注入的启动项目中,将具体的EntityStatsBuilder注入到Character对象中。为此,您可以根据需要使用DI框架或简单的构造函数注入。