【问题标题】:Getting lazy instance via kernel (Ninject)通过内核获取惰性实例(Ninject)
【发布时间】:2014-07-15 16:18:16
【问题描述】:

我正在使用 Ninject 代替 MEF,我想知道是否可以通过标准内核方法而不是通过 [inject] 来获取惰性实例。 我需要这个,因为在构建我的应用程序菜单时,我必须传递所有特定的视图模型,然后如果用户启用了该功能以将其添加到菜单中

谢谢

【问题讨论】:

    标签: ninject


    【解决方案1】:

    当然,您可以注入Lazy<T>,并且该值只会在您访问Lazy<T>.Value 时被实例化。 你也可以注入一个Func<T>,并在你喜欢的时候用它来创建T(使用func,每次调用都会创建一个新实例)。

    当然你也可以使用IResolutionRoot.Get<Lazy<T>>() 或IResolutionRoot.Get<Func<T>>(),但通常这是糟糕设计(服务定位器)的标志,所以在可行的情况下使用构造函数注入。

    编辑:“启用用户”何时发生?它是一次性的吗?之前和之后显示什么? 可能有其他/更好的设计来实现这一点,但很难用这么少的信息说。

    【讨论】:

    • 您好,我在 ITaggable 接口中定义的每个视图模型都有一个属性,该属性告诉角色名称,当用户登录时,它有一个角色列表,基于此我将项目添加到菜单.现在所有的视图模型都已经实例化了,因为它不是懒惰的......我一直在寻找一种更好的方法,这似乎就是这样
    • 要访问ITaggable 接口,您仍然需要一个实例。所以你仍然需要实例化所有视图模型,然后检查角色是否匹配,......所以你并没有真正赢得任何懒惰。如果您不想实例化视图模型,则角色必须静态可用。你也可以使用条件绑定:github.com/ninject/ninject/wiki/Contextual-Binding
    • 我的应用程序以这种方式工作:我有一个具有整个菜单结构的 xml(并且有一个反映视图模型标签和用户角色的属性标签)然后我有角色列表当前登录的用户和最后一个 IEnumerable (代表所有视图模型)。现在,如果用户当前启用了单个视图模型,我的代码迭代了所有视图模型,我发现它毫无用处..
    • 没错。这就是为什么你应该研究上下文绑定;-)。您可以执行以下操作:IResolutionRoot.GetAll<IViewModel>(new EnabledViewModelTagsParameter("tag1", "tag2"); 然后@binding 设置一个条件,即必须有一个带有匹配标签的EnabledViewModelTagsParameter。你甚至可以约定绑定这个:如果ITaggable 在视图模型上使用[Taggable] 属性。您需要更多信息吗?
    • 使用属性代替接口有什么好处?我还有一个问题......目前我在 NinjectBootstrapper 中有一个对内核的静态引用,ninject 本身不提供内核实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多