gpt4 book ai didi

c# - 我应该使用构造函数注入(inject)还是 IoC.Resolve?

转载 作者:行者123 更新时间:2023-11-30 18:22:37 27 4
gpt4 key购买 nike

我正在构建非常简单的棋盘游戏(只是为了学习一些新东西)。它将是跨平台的(使用 Xamarin 编写)。我已经编写了游戏的核心,但我不确定(仍然)我应该使用构造函数注入(inject)还是IoC 解析。现在我使用 IoC.Resolve 然后传递参数。

这是我的代码。我有 Game 有 2 个依赖项和类型。我有工厂来创建游戏和玩家:

Abc.MyGame.Domain

  • 接口(interface)

    public interface IGame
    {
    GameType GameType { get; }
    IGameBoard GameBoard { get; }
    List<IPlayer> Players { get; }

    // Other stuff...
    }

    public interface IGameBoard
    {
    //board stuff...
    }

    public interface IPlayer
    {
    int PlayerId { get; set; }
    PlayerType PlayerType { get; set; }
    }
  • 工厂接口(interface)

    public interface IGameFactory
    {
    IGame CreateGame(GameType type, IGameBoard board);
    }

    public interface IPlayerFactory
    {
    IPlayer CreatePlayer(PlayerType type, int id);
    }
  • 工厂

    public class GameFactory : IGameFactory
    {
    public IGame CreateGame(GameType type, IGameBoard board)
    {
    switch (type)
    {
    case GameType.SinglePlayer:
    return new MyGame(type, board,
    new List<IPlayer> { CreateHuman(1), CreateBot(2) });
    case GameType.TwoPlayers:
    return new MyGame(type, board,
    new List<IPlayer> { CreateHuman(1), CreateHuman(2) });
    case GameType.Online:
    return new MyGame(type, board,
    new List<IPlayer> { CreateHuman(1), CreateOnlinePlayer(2) });

    }
    return null;
    }
    }

然后,有一个API。用户界面使用:

Abc.MyGame.API

public class GameAPI
{
public IGame CurrentGame { get; set; }

public IGame CreateGame(IGameFactory gameFactory, GameType type, IBoard board)
{
CurrentGame = gameFactory.CreateGame(type, board);
return CurrentGame;
}

// Other stuff, like make move etc...
}

...和我的用户界面:

Abc.MyGame.UI.WinForms

public partial class Form1 : Form
{
private GameAPI api = new GameAPI();
IKernel kernel = new StandardKernel();

public Form1()
{
InitializeComponent();

// Load all dependencies
var modules = new List<INinjectModule> { new GameModule() };
kernel.Load(modules);
}

private void buttonStartGame(object sender, EventArgs e)
{
IGameBoard board = kernel.Get<IGameBoard>(
new ConstructorArgument("width", 7),
new ConstructorArgument("height", 6)
);

api.CreateGame(kernel.Get<IGameFactory>(), GameType.TwoPlayers, board);
}
}

我需要在我的 IGame 中使用 IGameBoard。只有在那里。我需要将棋盘和玩家注入(inject) IGame

这是我的问题:我真的需要在程序的最“前面”解析 IGameBoard 吗?当有人点击“开始游戏”按钮时,我在 UI 中解决了它。然后我通过 API 传递这个板,然后我将它传递给 GameFactory,然后我将它传递给 Game 构造函数(最后!)。在 GameFactory 中创建(或解析)IPlayerFactoryIGameBoard 是一种不好的做法吗? API.CreateGame 在那种情况下将只有 type 参数?我的意思是对于特定的 GameFactory 只有一个板(每次都一样),所以我不确定我是否需要在一开始就创建板......

编辑:MyGame 构造函数:

public class MyGame : IGame
{
public IBoard Board { get; }
public GameType Type { get; }
public List<IPlayer> Players { get; }

public MyGame(GameType type, IBoard board, List<IPlayer> players)
{
Type = type;
Board = board;
Players = players;
}

//...
}

最佳答案

Do I really need to resolve IGameBoard at the very "front" of my program?

是的,需要在应用程序的入口点和生命周期范围(如果有)开始时解决依赖关系。通常,这是抽象的(就像在 ASP.NET MVC 中一样),因此您永远不必调用 kernel.Get<> (或任何其他 container.Resolve<>)你自己。在 WinForms 中没有这样的机制,所以你必须自己解决依赖关系,最好只解决根依赖关系,如下所示:

public static class Program
{
private static void Main()
{
var kernel = new StandardKernel();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(kernel.Get<Form1>());
}
}

通过在您的主窗体上放置正确的依赖项(可能在您的游戏案例中包括一个工厂),您应该不再需要 kernel.Get<>在您的应用程序中。

关于c# - 我应该使用构造函数注入(inject)还是 IoC.Resolve?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33786346/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com