3-х уровневая архитектура в торговых автоматах с сохранением OCP - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю над проектом торгового автомата, и я попытался разделить его на слои UI и BL, но у меня возникли проблемы. Например, у меня есть эта функция для оплаты монетами, которая происходит от абстрактного класса:

public override void Pay(decimal amount)
{
    while (currentCoins < amount)
    {
        // Print instructions
        // Get input

        if (Valid)
        {
            // logic
        }
        else
        {
            // Print error
        }
    }
}   

Так что проблема в том, что у меня нет доступа к интерфейсу внутри BL, но мне нужно постоянное общение с UI. Я думал о создании функции для каждого метода оплаты в пользовательском интерфейсе, но это нарушает OCP ...

Я ищу идеи элегантного решения, которые не нарушат SOLID принципы.

Есть ли какой-нибудь шаблон или что-то, что может решить мою проблему? (шаблон стратегии?) Буду признателен за любые рекомендации / идеи.

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вы должны создать как минимум 3 слоя для однородной многоуровневой архитектуры. Важно разделить бизнес и передачу данных. Например, если необходимо создать структуру:

  • Сущности
  • Data Logi c Слой
  • Бизнес-логика c Слой
  • Уровень представления

Таким образом, ваша структура должна быть такой:

  • / Соединения / сущности / DLL
  • / iDLL (интерфейсы / абстрактные классы)
  • / BLL
  • / iBLL (интерфейсы / абстрактные классы)
  • / UI

Вы должны определить свои функции в iDLL для передачи данных , Например сохранить или рассчитать или оплаты et c. Затем внедрите в DLL эти функции. После этого класс BLL должен быть расширен классом DLL. В BLL вы создаете свою программу logi c .For Example; проверяйте, пока текущие деньги не станут равны комиссии, если они равны, отправьте их на слой данных. При этом вы можете удерживать монету в структуре и вызывать ее из уровня представления, или вы можете настроить обратный лог c, проверить его на уровне представления и затем проверить его на бизнес-уровне. Я думаю, что второй лог c лучший. Почти веб-проект работает так.

0 голосов
/ 21 апреля 2020

Вы можете использовать шаблон Observer

using System;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Text;
using System.Collections.Concurrent;

public class program
{
    public static void Main()
    {
        var robot = new Robot();

        robot.Died += (sender, eventArgs) => Console.WriteLine("Robot Died");

        robot.TakeDamage();
        robot.TakeDamage();
    }
}

// --- Everything above this line would be in the UI layer
// --- Everything below this line would be in the business/domain layer     

public class Robot
{
    private int _health = 2;
    public EventHandler Died;

    public Robot(){}

    public void TakeDamage()
    {
        _health--;

        if (_health == 0)
            Died.Invoke(this, new EventArgs());
    }
}
...