为了账号安全,请及时绑定邮箱和手机立即绑定

我如何为 Ninject 提供额外的参数?

我如何为 Ninject 提供额外的参数?

C#
慕尼黑5688855 2022-11-22 15:46:05
我需要自动解决我的 Windows 窗体的依赖关系。唯一的问题是我的表单构造函数也需要一个整数值。请查看代码部分中的实现。   //Ninject bindings   public class Bindings : NinjectModule    {        public override void Load()        {            Bind<ILogger>().To<LogToDB>();            Bind<ICopy>().To<CopyToFolder>();                    }    }  //WinForm - Form1   public partial class Form1 : Form    {        public readonly ILogger _processRepository;        public readonly Icopy _copy;        public readonly int ValueToEdit;        public Form1(int valueToEdit, ILogger logger, ICopy copy)        {            this._processRepository = logger;            this._copy = copy;            this.ValueToEdit = valueToEdit;            InitializeComponent();        }    }    //main    /// <summary>    /// The main entry point for the application.    /// </summary>    [STAThread]    static void Main()    {        IKernel kernel = new StandardKernel(new Bindings());                    Application.Run(kernel.Get<Form1>());                }我得到一个错误:Ninject.ActivationException: 'Error activating int No matching bindings are available, and the type is not self-bindable.如何自动解析表单依赖关系并传递整数值?实际上,我使用了相同的表格来进行添加和编辑,所以在编辑时,应该设置这个编辑值。
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

我想解决这个问题最干净的方法是创建一个工厂:


interface IForm1Factory

{

    Form1 Create(int valueToEdit);

}


class Form1Factory

{

    public readonly ILogger _processRepository;

    public readonly Icopy _copy;


    public Form1Factory(ILogger logger, ICopy copy)

    {

        this._processRepository = logger;

        this._copy = copy;

    }


    public Form1 Create(int valueToEdit)

    {

        return new Form1(valueToEdit, _processRepository, _copy);

    }

}

还有一个扩展(Ninject.Extensions.Factory)允许您自动生成工厂,例如Form1Factory基于接口的。如果您使用该扩展名,则您声明使用Bind<IForm1Factory>().ToFactory().


查看完整回答
反对 回复 2022-11-22
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

using Ninject;

using Ninject.Modules;

using Ninject.Parameters;  

//Add new class  

public class CompositionRoot

{

    public static IKernel _ninjectKernel;

    public static void Wire(INinjectModule module)

    {

        _ninjectKernel = new StandardKernel(module);

    }

    public static T Resolve<T>()

    {

        return _ninjectKernel.Get<T>();

    }

    public static T ResolveWithArgument<T>(ConstructorArgument argument)

    {

        return _ninjectKernel.Get<T>(argument);

    }

}


//Ninject bindings

public class Bindings : NinjectModule

{

    public override void Load()

    {

        Bind<ILogger>().To<LogToDB>();

        Bind<ICopy>().To<CopyToFolder>();            

    }

}


//WinForm - Form1

public partial class Form1 : Form

{

    public readonly ILogger _processRepository;

    public readonly Icopy _copy;

    public readonly int ValueToEdit;

    public Form1(ILogger logger, ICopy copy, int valueToEdit)

    {

        this._processRepository = logger;

        this._copy = copy;

        this.ValueToEdit = valueToEdit;

        InitializeComponent();

    }

}


//main

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

   //Apply the binding rule first

   CompositionRoot.Wire(new Bindings());   

   //Then resolve your form dependencies this way using Ninject passing along the 

   constructor arguments. 

   CompositionRoot.ResolveWithArgument<Form1>(new ConstructorArgument("valueToEdit", 

   1)).ShowDialog();      

}


查看完整回答
反对 回复 2022-11-22
  • 2 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信