Внедрение конструктора в консольное приложение - PullRequest
0 голосов
/ 23 декабря 2018

Я рефакторинг блочного кода и хотел использовать инжектор конструктора для моих услуг.Пока я получаю нулевые исключения для своих сервисов (вероятно, потому что у меня еще нет контейнера).У кого-нибудь есть идея, как мне это реализовать?

namespace RampantRobots_NextLvl
{
    class Program
    {
        private static IBoardService _boardService;
        private static IPlayerService _playerService;

        public Program(IBoardService boardService,IPlayerService playerService)
        {
            _boardService = boardService;
            _playerService = playerService;
        }

        static void Main(string[] args)
        {
            var player = _playerService.Create(1, 1);
            var board = _boardService.Create(5,10,3,3,player);

            _boardService.Draw(player, board);
            _boardService.MovePlayer(player, board);

            Console.ReadLine();
        }
    }
}

1 Ответ

0 голосов
/ 23 декабря 2018

Даже без контейнера код все еще может использовать Pure DI , как описано здесь

Во-первых, лучше сделать поля экземпляров этих явных зависимостей, а неstatic.

private readonly IBoardService _boardService;
private readonly IPlayerService _playerService;

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

public void Invoke() {
    var player = _playerService.Create(1, 1);
    var board = _boardService.Create(5, 10, 3, 3, player);

    _boardService.Draw(player, board);
    _boardService.MovePlayer(player, board);

    //...
}

, который оставляет Main действующимкак корень композиции, где все зависимости создаются и внедряются в зависимый класс и вызывается требуемая функциональность.

Полный пример

class Program {
    private readonly IBoardService _boardService;
    private readonly IPlayerService _playerService;

    public Program(IBoardService boardService, IPlayerService playerService) {
        _boardService = boardService;
        _playerService = playerService;
    }

    public void Invoke() {
        var player = _playerService.Create(1, 1);
        var board = _boardService.Create(5, 10, 3, 3, player);

        _boardService.Draw(player, board);
        _boardService.MovePlayer(player, board);

        //...
    }

    static void Main(string[] args) {
        //Assuming default implementations
        IBoardService boardService = new BoardService(); 
        IPlayerService playerService = new PlayerService();

        //Explicit dependency injection via constructor
        var program = new Program(boardService, playerService);

        //invoke desired functionality
        program.Invoke();

        Console.ReadLine();
    }
}

Когда контейнерв конечном итоге введено (если вообще) , для регистрации зависимостей потребуется только корень компоновки.

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