C#Ninject:如何根据字段注入依赖项?

时间:2016-10-07 03:28:05

标签: c# dependency-injection ninject

一个名为Round的类是冒险游戏中的关卡设计。它提交number表示玩家所处的级别。不同级别将有不同的数字来猜测。这些数字由字段FigureFactory生成。

问题是:使用Ninject进行依赖注入,如何根据字段FigureFactory将相应的round设置为变量number?例如,当字段number == 1时,相应的工厂为FigureFactory1,当字段number == 2时,相应的工厂为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));
        }
    }
}

工厂方法模式实施:

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

混凝土工厂(还有一些像这样);

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



    }
}

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



    }
}

用法:

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

            int[] array=round.GetCurrentRoundFigures();

0 个答案:

没有答案