Циклическая зависимость между Datas-проектом и Builders-проектом - PullRequest
0 голосов
/ 17 октября 2018

Вот код, который я хочу получить:

  • A Character имеет strength, constitution и некоторые другие характеристики.
  • Каждый Character имеет BaseStats в зависимости от своего класса.
  • Каждый Character имеет бонус RandomStats, с положительными значениями от 0 до 3.
  • Статистика не может быть ниже 1 или выше 10.
  • A Character может иметь Bonus и Malus в своей статистике.
  • Если у Character есть 8 в strength, плюс бонус 4 и малус 1, у него, наконец, 10 (8 + 4-1 = 11> 10).
  • Если у Character есть 3 по конституции, плюс бонус 1 и малус 4, у него, наконец, 1 (3 + 1-4 = 0 <1). </li>

В моем решении .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();
    }
}

Как мне изменить мою глобальную архитектуру, чтобы не было этой циклической зависимости?

1 Ответ

0 голосов
/ 17 октября 2018

То, что вы ищете, называется принципом инверсии зависимостей https://en.wikipedia.org/wiki/Dependency_inversion_principle

По сути, создайте интерфейс для вашего EntityStatsBuilder и поместите его в отдельный проект.Теперь оба проекта могут ссылаться на этот интерфейсный проект.Если вы хотите следовать соглашению об именах Microsoft, назовите его SomethingSomething.Abstractions.

. Теперь в вашем автозагрузочном проекте с использованием внедрения зависимостей вы вводите конкретный EntityStatsBuilder в ваш Character объект.Для этого вы можете использовать либо DI Framework, либо простое внедрение в конструктор, в зависимости от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...