2

这是我的场景:

我有一个这样的应用程序:

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

在此处输入图像描述

1-有ClassB哪个被注入ClassA哪个被注入1stViewModel哪个被注入1stView

2-再有ClassR哪个被注入ClassQWich被注入2ndViewModel哪个被注入2ndView

3-这发生在第三和第四个窗口

问题:

1- 当需要(当用户单击第一个按钮或第二个按钮时)不在我的作文根目录中时,我可以做些什么来解决这些类?

2-如果我不将我的视图注入ViewModels我的视图并且我想ViewModel在我的视图中创建我的新实例,显然它需要一个参数,例如IClassA用于第一个和IClassQ第二个。我该怎么做?

4

2 回答 2

2

使用 ninject.extensions.factory 可以ToFactory为您定义的给定接口定义绑定,也可以在构造函数中注入 a Lazy<T>。更多详细信息请参见此处的扩展 wiki https://github.com/ninject/ninject.extensions.factory/wiki

于 2013-07-14T12:39:50.483 回答
2

(是对这个问题的重复的答案

对丹尼尔的回答 +1 - 这是 100% 正确的。只是一个解释和一个例子。

在适当的地方(您希望及时创建和缓存单个依赖项实例)Lazy是最佳选择。不需要绑定,您只需要存在扩展。

Lazy<IFoo>与创建 s 的工厂之间的明显区别在于IFoo,您将始终拥有相同的实例,而工厂的目的是创建新的实例。

如果您只是想让工厂为您创建一个 Foo 而不是使用Func<IFoo>,您可以完全使用以下内容:

interface IFooFactory
{
   IFoo CreateFoo();
}

Bind<IFoo>().To<Foo>();
Bind<IFooFactory>().ToFactory();

.ToFactory()位在幕后执行所有实现(即,它创建拦截器和 Castle Dynamic Proxy,其主体可实现以下目标:

class _SomethingAnonymous : IFooFactory
{
    readonly IResolutionRoot _resolutionRoot; 

    public _SomethingAnonymous(IResolutionRoot resolutionRoot)
    {
        _resolutionRoot=resolutionRoot; 
    }

    IFoo CreateFoo() 
    { 
         _resolutionRoot.Get<IFoo>();
    }
 }

和它BindIFooFactory

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

于 2013-07-23T14:51:49.710 回答