C# Ninject:使用构造函数参数实现(字符串名称、函数<;IContext、对象>;回调)

C# Ninject:使用构造函数参数实现(字符串名称、函数<;IContext、对象>;回调),c#,ninject,C#,Ninject,我有一个MVVMWP7应用程序,其中我试图将一个值从一个页面/视图模型发送到另一个视图模型的构造函数。我已经设置了Ninject,并使用以下行将其用于静态测试值: this.Bind<TaskViewModel>().ToSelf().WithConstructorArgument("TaskID", 2690) this.Bind().ToSelf().WithConstructorArgument(“TaskID”,2690) 同样,这适用于静态值,但我需要它是用户选择的变量

我有一个MVVMWP7应用程序,其中我试图将一个值从一个页面/视图模型发送到另一个视图模型的构造函数。我已经设置了Ninject,并使用以下行将其用于静态测试值:

this.Bind<TaskViewModel>().ToSelf().WithConstructorArgument("TaskID", 2690)
this.Bind().ToSelf().WithConstructorArgument(“TaskID”,2690)
同样,这适用于静态值,但我需要它是用户选择的变量。我被告知要使用超负荷

WithConstructorArgument(string name, Func<IContext,object> callback). 
WithConstructorArgument(字符串名,Func回调)。
我认为此回调将调用第一个ViewModel上的函数并获取值


但我并没有成功,我承认我在Ninject或使用Func回调参数方面都不是很有经验。我尝试设置一个委托和函数来从第一个ViewModel获取值,但这会给出一个错误,表明我正在尝试传入一个类型。我如何确切地指定该参数以使用回调,以及在第一个ViewModel或其他内容中使用委托是否正确?

正如我在您的另一篇文章中所说,在get上传递参数可能是更好的方法。因此,请创建工厂接口

public interface ITaskViewFactory
{
    TaskViewModel CreateTaskViewModel(int id);
}
在您的引导程序(负责使用Ninject创建所有内容的程序集,它通常应该是另一个程序集,而不是您实现具有业务价值的所有内容)中添加实现

Public class TaskViewFactory : ITaskViewFactory
{
     Private IKernel kernel;
     Public TaskViewFactory(IKernel kernel)
     {
         this.kernel = kernel;
     }

     public TaskViewModel CreateTaskViewModel(int taskId)
     {
         this.kernel.Get<ITaskViewModel>(new ConstructorArgument("TaskId", taskId);
     }
 }
公共类TaskViewFactory:ITaskViewFactory
{
私有IKernel内核;
公共任务视图工厂(IKernel内核)
{
this.kernel=内核;
}
公共任务视图模型CreateTaskViewModel(int taskId)
{
Get(新构造函数参数(“TaskId”,TaskId);
}
}

然后将工厂注入您的任务选择命令,并在选择任务时调用工厂。

您确信使用依赖注入是这样的好主意吗?我的意思是解决基于用户输入的组件依赖关系?这是我在NyPoT上认为非常有知识的人向我提出的,正如我在我的问题中所说的那样。我不是。如果你有一个适合MVVM的解决方案,我绝对愿意改变我的方法。@Waltedbn:Remo Gloor是Ninject项目目前活跃的开发人员。他是世界上对这个主题最有知识的人。听他的。是的,我知道,Remo就是我真正指的那个人。