控制台应用程序中的构造函数注入



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

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

即使没有容器,代码仍然可以使用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();
}
}

当容器最终被引入(如果有的话)时,只需要对组合根进行refatcored以注册依赖关系。

最新更新