这是我的情景:
我有这样的应用程序:
我使用Ninject作为我的DI容器,我正在使用WPF
1 - ClassB
注入ClassA
注入1stViewModel
注入1stView
2-再次将ClassR
注入ClassQ
注入2ndViewModel
2ndView
注入ViewModels
3 - 这发生在第3和第4窗口
问题:
1-如果需要(当用户点击第一个按钮或第二个按钮时)不在我的合成根目录中,我可以做什么来解决类?
2-如果我没有将ViewModel
注入我的视图,我想在我的视图中创建IClassA
的新实例,显然它需要一个参数IClassQ
例如,第1和{{1}}为第2。我该怎么办?
答案 0 :(得分:2)
使用ninject.extensions.factory可以为您定义的给定接口定义ToFactory
绑定,或者可以在构造函数中注入Lazy<T>
。更多详细信息,请参阅此处https://github.com/ninject/ninject.extensions.factory/wiki
答案 1 :(得分:2)
(是answer to a duplicate of this question)
丹尼尔回答+1,这是100%正确的。只是一个解释和一个例子。在适当的地方(您希望及时创建单个依赖项实例的和缓存),Lazy
是最佳选择。不需要绑定,只需要扩展即可。
Lazy<IFoo>
与创建IFoo
的工厂之间的明显区别在于,您将始终拥有相同的实例,而工厂的目的是创建新的实例。
如果您只是希望工厂为您创建Foo而不是Func<IFoo>
,则可以使用以下内容:
interface IFooFactory
{
IFoo CreateFoo();
}
Bind<IFoo>().To<Foo>();
Bind<IFooFactory>().ToFactory();
.ToFactory()
位执行幕后的所有实现(即它创建拦截器和城堡动态代理,其中包含实现以下内容的实体:
class _SomethingAnonymous : IFooFactory
{
readonly IResolutionRoot _resolutionRoot;
public _SomethingAnonymous(IResolutionRoot resolutionRoot)
{
_resolutionRoot=resolutionRoot;
}
IFoo CreateFoo()
{
_resolutionRoot.Get<IFoo>();
}
}
和Bind
s IFooFactory
。
使这些代码不具体,意味着(如果有必要,在开发代码时)提供了多种方法来超越基本创建而没有参数。