如何推迟解决课程?

时间:2013-07-13 19:31:13

标签: c# .net mvvm ninject

这是我的情景:

我有这样的应用程序:

我使用Ninject作为我的DI容器,我正在使用WPF

enter image description here

1 - ClassB注入ClassA注入1stViewModel注入1stView

2-再次将ClassR注入ClassQ注入2ndViewModel 2ndView注入ViewModels

3 - 这发生在第3和第4窗口

问题:

1-如果需要(当用户点击第一个按钮或第二个按钮时)不在我的合成根目录中,我可以做什么来解决类?

2-如果我没有将ViewModel注入我的视图,我想在我的视图中创建IClassA的新实例,显然它需要一个参数IClassQ例如,第1和{{1}}为第2。我该怎么办?

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

使这些代码不具体,意味着(如果有必要,在开发代码时)提供了多种方法来超越基本创建而没有参数。