c# - 控制台应用程序中的构造函数注入
问题描述
我正在重构一个块代码,并想为我的服务使用构造函数注入。到目前为止,我的服务出现空异常(可能是因为我还没有容器)。有人知道我如何实现这个吗?
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();
}
}
当最终引入容器时(如果有的话),只需要重新定义组合根以注册依赖项。
推荐阅读
- python - 我无法在 pycharm 中安装 openpyxl
- string - pandas_datareader 在从雅虎获取股票拆分时出错
- github - 如何从 Github 存储库嵌入代码,就像你可以用 gist 做的那样?
- splunk - Citrix/COTS 应用程序监视器 - Splunk
- python - Pip 安装出错,退出状态为 1 [已解决]
- javascript - TypeError: this.props.nextStep 不是函数 React 错误
- c++ - 从 Arduino 上的多个模拟引脚读取输入的代码不会显示值
- c# - 如何用accord.net实现人脸识别?
- mysql - 如何通过Node JS在mysql数据库中存储和检索utf8字符
- java - Surefire 实际上并没有运行测试