首页 > 解决方案 > 控制台应用程序中的构造函数注入

问题描述

我正在重构一个块代码,并想为我的服务使用构造函数注入。到目前为止,我的服务出现空异常(可能是因为我还没有容器)。有人知道我如何实现这个吗?

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();
        }
    }
}

标签: c#dependency-injection

解决方案


即使没有容器,代码仍然可以使用Pure DI,如此处所述

首先,最好使那些显式依赖项实例字段而不是静态的。

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();
    }
}

当最终引入容器时(如果有的话),只需要重新定义组合根以注册依赖项。


推荐阅读