【发布时间】:2014-07-15 16:18:16
【问题描述】:
我正在使用 Ninject 代替 MEF,我想知道是否可以通过标准内核方法而不是通过 [inject] 来获取惰性实例。 我需要这个,因为在构建我的应用程序菜单时,我必须传递所有特定的视图模型,然后如果用户启用了该功能以将其添加到菜单中
谢谢
【问题讨论】:
标签: ninject
我正在使用 Ninject 代替 MEF,我想知道是否可以通过标准内核方法而不是通过 [inject] 来获取惰性实例。 我需要这个,因为在构建我的应用程序菜单时,我必须传递所有特定的视图模型,然后如果用户启用了该功能以将其添加到菜单中
谢谢
【问题讨论】:
标签: ninject
当然,您可以注入Lazy<T>,并且该值只会在您访问Lazy<T>.Value 时被实例化。
你也可以注入一个Func<T>,并在你喜欢的时候用它来创建T(使用func,每次调用都会创建一个新实例)。
当然你也可以使用IResolutionRoot.Get<Lazy<T>>() 或IResolutionRoot.Get<Func<T>>(),但通常这是糟糕设计(服务定位器)的标志,所以在可行的情况下使用构造函数注入。
编辑:“启用用户”何时发生?它是一次性的吗?之前和之后显示什么? 可能有其他/更好的设计来实现这一点,但很难用这么少的信息说。
【讨论】:
ITaggable 接口,您仍然需要一个实例。所以你仍然需要实例化所有视图模型,然后检查角色是否匹配,......所以你并没有真正赢得任何懒惰。如果您不想实例化视图模型,则角色必须静态可用。你也可以使用条件绑定:github.com/ninject/ninject/wiki/Contextual-Binding
IResolutionRoot.GetAll<IViewModel>(new EnabledViewModelTagsParameter("tag1", "tag2"); 然后@binding 设置一个条件,即必须有一个带有匹配标签的EnabledViewModelTagsParameter。你甚至可以约定绑定这个:如果ITaggable 在视图模型上使用[Taggable] 属性。您需要更多信息吗?