我正在开发一个WPF应用程序,它具有很大的业务逻辑和数据处理能力 . 根据使用IoC的想法,我决定使用Ninject作为这部分逻辑和数据处理的依赖注入器 .
我初始化了ninject的内核,并使用 App.xaml.cs
文件中的具体类(即默认的app类)绑定了接口 . 到目前为止一切都很好 .
问题是在我的应用程序的某个地方我需要一个类的两个具体实例(我不想在构造函数中作为参数传递) . 其实我需要做的是:
var instance1 = kernel.Get<IClassName>();
问题是我无法访问 kernel
(Ninject内核的具体实例) .
我知道在ASP.NET MVC中我可以做类似的事情
var instance1 = (IClassName)System.Web.Mvc.DependencyResolver.Current.GetService(typeof(IClassName));
我可以使用类似的东西吗?或者我是否被迫用服务定位器模式来解决问题(我知道存在相互矛盾的意见)?
2 回答
由于您希望每个类使用多个依赖项,因此您应该设计模式而不是DI容器来解决您的问题 .
至少有几种选择 . 以下是设置场景的一些基本框架:
您可以使用composite pattern,然后您可以在列表中订阅演示者 .
然后将它连接起来:
在Ninject中,上面看起来像:
或者您可以使用decorator pattern:
然后将它连接起来:
在Ninject中,上面看起来像:
使用设计模式的优点是最终会得到松散耦合的代码,这些代码完全模块化,可扩展,甚至独立于DI容器 .
如何使用Ninject.Extensions.Factory实例化所述依赖项?你可以注入
Func<T>
,当你以后调用它时,它将返回一个新实例化的T
. 如果您只是想要实例化单个实例"on first usage",那么还有Lazy<T>
.然后你还可以定义接口工厂,如:
与相应的绑定: