Свойство установлено, null в другом классе. C # - PullRequest
0 голосов
/ 31 августа 2018

Хорошо, я понятия не имею, почему это происходит.

Я установил свойство, и сразу после того, как я установил его, оно равно нулю в другом классе. Если он идет с отладчиком, он просто показывает, что он установлен, и что его значение равно нулю в другом классе.

Это мой код: (убрал весь ненужный код)

public class SnakeGame : SenseHatSnake, ISnakeGame
{
    private readonly IBody _body;

    public SnakeGame(ISenseHat senseHat, IBody body)
        : base(senseHat)
    {
        _body = body;
    }

    private void UpdateGame(Object state)
    {

        _movement.PreviousPositions.Add(new Position()
        {
            X = _movement.X,
            Y = _movement.Y
        });

        if (_body.DetectCollision(_movement.X, _movement.Y))
        {
            GameOver();
        }
    }
}

Это происходит в DetectCollision в классе тела.

public class Body : IBody
    {    
        private readonly IMovement _movement;

        public Body(IMovement movement)
        {
            _movement = movement;
        }

        public bool DetectCollision(int x, int y)
        {
            for (int i = 1; i < Length + 1; i++)
            {
                if (_movement.PreviousPositions.Count > i)
                {
                    int bX = _movement.PreviousPositions[_movement.PreviousPositions.Count - i - 1].X;
                    int bY = _movement.PreviousPositions[_movement.PreviousPositions.Count - i - 1].Y;

                    if (bX == x && bY == y)
                    {
                        return true;
                    }
                }
            }

            return false;
        }

    }

Я только что установил _movement.PreviousPositions, и я вижу его в отладчике, но как только он появится в Body _movement.PreviousPositions, он будет нулевым.

Movement.cs:

public class Movement : IMovement
{
    public List<Position> PreviousPositions { get; set; }      
}

Примечание:

Я использую DI, я что-то там не так делаю? (Autofac)

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();



        var builder = new ContainerBuilder();
        builder.RegisterType<Body>().As<IBody>();
        builder.RegisterType<Display>().As<IDisplay>();
        builder.RegisterType<Draw>().As<IDraw>();
        builder.RegisterType<Food>().As<IFood>();
        builder.RegisterType<Movement>().As<IMovement>();
        builder.RegisterType<SnakeGame>().As<ISnakeGame>();
        builder.RegisterType<ISenseHat>().As<ISenseHat>();
        var container = builder.Build();

        var body = container.Resolve<IBody>();
        var display = container.Resolve<IDisplay>();
        var draw = container.Resolve<IDraw>();
        var food = container.Resolve<IFood>();
        var movement = container.Resolve<IMovement>();

        Task.Run(async () =>
        {
            ISenseHat senseHat = await SenseHatFactory.GetSenseHat().ConfigureAwait(false);
            var snakeGame = new SnakeGame(senseHat, body, display, draw, food, movement);
            snakeGame.Run();
        });


    }


}

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

По умолчанию Autofac регистрирует компоненты как InstancePerDependency, поэтому этот код получит два уникальных экземпляра:

var a = container.Resolve<IExample>();
var b = container.Resolve<IExample>();

Если вы хотите одиночный, вам нужно зарегистрировать объект как таковой, используя .SingleInstance():

builder.RegisterType<Movement>().As<IMovement>().SingleInstance();

Это должно решить вашу проблему, хотя я заметил, что вы, похоже, используете антишаблон поиска службы , вручную разрешая каждую службу. Вы можете изменить свой код так:

var builder = new ContainerBuilder();
builder.RegisterType<Body>().As<IBody>();
builder.RegisterType<Display>().As<IDisplay>();
builder.RegisterType<Draw>().As<IDraw>();
builder.RegisterType<Food>().As<IFood>();
builder.RegisterType<Movement>().As<IMovement>().SingleInstance();
builder.RegisterType<SnakeGame>().As<ISnakeGame>();
builder.RegisterInstance<ISenseHat>(await SenseHatFactory.GetSenseHat().ConfigureAwait(false));

var container = builder.Build();

var snakeGame = container.Resolve<ISnakeGame>();
snakeGame.Run();
0 голосов
/ 31 августа 2018

RegisterType разрешается в новый экземпляр, если запрашивается тип. Если вы хотите поделиться одним экземпляром между своими классами, используйте вместо этого RegisterInstance для своего класса Movement, например,

        var movement = new Movement();
        var builder = new ContainerBuilder();
        builder.RegisterType<Body>().As<IBody>();
        builder.RegisterType<Display>().As<IDisplay>();
        builder.RegisterType<Draw>().As<IDraw>();
        builder.RegisterType<Food>().As<IFood>();
        **builder.RegisterInstance<IMovement>(movement);**
        builder.RegisterType<SnakeGame>().As<ISnakeGame>();
        builder.RegisterType<ISenseHat>().As<ISenseHat>();
        var container = builder.Build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...