【问题标题】:Ninject: Implement WithConstructorArgument(string name, Func<IContext,object> callback)Ninject:实现 WithConstructorArgument(字符串名称,Func<IContext,object> 回调)
【发布时间】:2011-07-29 17:01:12
【问题描述】:

我有一个 MVVM WP7 应用程序,我在其中尝试将值从一个 Page/ViewModel 发送到第二个 ViewModel 的构造函数。我已经设置了 Ninject,并使用如下行使其与静态测试值一起使用:

this.Bind<TaskViewModel>().ToSelf().WithConstructorArgument("TaskID", 2690)

同样,它适用于静态值,但我需要它是用户选择的变量。我被告知要使用重载

WithConstructorArgument(string name, Func<IContext,object> callback). 

我认为这个回调会在第一个 ViewModel 上调用一个函数并获取值。

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

【问题讨论】:

  • 您确定以这种方式使用依赖注入是个好主意吗?我的意思是根据用户输入解决组件依赖关系?
  • 它是由我认为对 Ninject 非常了解的人向我推荐的,正如我在问题中所说的那样,我不是。如果您有适合 MVVM 的合适解决方案,我绝对愿意改变我的方法。
  • @Waltedbn:Remo Gloor 是 Ninject 项目的当前活跃开发者。他是世界上对这个话题最了解的人。听他的。
  • 是的,我知道,雷莫是我真正指的那个人。

标签: c# ninject


【解决方案1】:

正如我在您的另一篇文章中已经说过的那样,在 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);
     }
 }

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

【讨论】:

    猜你喜欢
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2023-03-15
    相关资源
    最近更新 更多