0

A class named Round is a level design in a adventure game.Its filed number indicate which level the player is in. Different level will have different figures to guess. The figures are produced by field FigureFactory.

The question is: using Ninject for dependency injection, how can I set the cooresponding FigureFactory to the variable round, according to the field number? For instance, when field number==1, the cooresponding factory is FigureFactory1, when field number==2, the cooresponding factory is FigureFactory2?

using GuessFigure.Model.Factory;
using Ninject;
using Ninject.Modules;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ninject.Planning.Bindings;

namespace GuessFigure.Model
{
    class Round
    {
        private int number=1;

        private FigureFactory figureFactory;

       [Inject]
       internal void  SetFigureFactory(FigureFactory figureFactory)
       {
            this.figureFactory = figureFactory;
       }

        public int[] GetCurrentRoundFigures()
        {
            return figureFactory.Produce(number);
        }
    }


    //this not work, help please   
    class RoundModule : NinjectModule
    {
        public override void Load()
        {
            Bind<FigureFactory>().To<FigureFactoryRound1>().When(request=>request.ParentRequest.Target.Type.GetField("number").Equals(1));
            Bind<FigureFactory>().To<FigureFactoryRound2>().When(request => request.Target.Type.GetField("number").Equals(2));
            Bind<FigureFactory>().To<FigureFactoryRound3>().When(request => request.Target.Type.GetField("number").Equals(3));
            Bind<FigureFactory>().To<FigureFactoryRound4>().When(request => request.Target.Type.GetField("number").Equals(4));
            Bind<FigureFactory>().To<FigureFactoryRound5>().When(request => request.Target.Type.GetField("number").Equals(5));
        }
    }
}

Factory Method Pattern implementation:

using System;

namespace GuessFigure.Model
{
    abstract class FigureFactory
    {
        protected int figureNumber;
            public FigureFactory(int figureNumber)
        {
            this.figureNumber = figureNumber;
        }

        internal  int[] Produce()
        {
            int[] figureArray = new int[figureNumber];

            for (int i = 0; i < figureNumber; i++)
            {
                figureArray[i] = Algorithm(i + 1);
            }
            return figureArray;
        }

        abstract protected int Algorithm(int inputNumber);
    }
}

Concrete Factory(there are still some like this);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GuessFigure.Model
{
    class FigureFactoryRound1 : FigureFactory
    {
        public FigureFactoryRound1(int figureNumber) : base(figureNumber)
        {
        }

        protected override int Algorithm(int inputNumber)
        {
            return inputNumber;
        }
    }
}

class FigureFactoryRound3 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GuessFigure.Model.Factory
{
    class FigureFactoryRound3 : FigureFactory
    {
        public FigureFactoryRound3(int figureNumber) : base(figureNumber)
        {
        }

        protected override int Algorithm(int inputNumber)
        {
            return (int) Math.Pow( inputNumber,2) ;
        }



    }
}

class FigureFactoryRound4 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GuessFigure.Model.Factory
{
    class FigureFactoryRound4 : FigureFactory
    {
        public FigureFactoryRound4(int figureNumber) : base(figureNumber)
        {
        }

        protected override int Algorithm(int inputNumber)
        {
            return (int)Math.Pow(inputNumber, 3);
        }



    }
}

Usage:

  IKernel kernel = new StandardKernel(new RoundModule());
            Round round = new Model.Round();
            round.SetFigureFactory(kernel.Get<FigureFactory>());

            int[] array=round.GetCurrentRoundFigures();
guo
  • 9,674
  • 9
  • 41
  • 79

0 Answers0