如何在ninject 2.0中使用此功能?
MyType obj = kernel.Get<MyType>(With.Parameters.ConstructorArgument("foo","bar"));
Run Code Online (Sandbox Code Playgroud)
"With"不存在:(
我有这样的界面ITradingApi:
public interface ITradingApi
{
IOrder CreateOrder(...);
IEnumerable<Symbol> GetAllSymbols();
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是交易软件供应商的不同API的外观.我的视图模型在其构造函数中依赖于此交易API:
public class MainViewModel
{
public MainViewModel(ITradingApi tradingApi) { /* ... */ }
// ...
}
Run Code Online (Sandbox Code Playgroud)
我使用Ninject作为IoC容器,因此我将创建一个我的视图模型的实例,如下所示:
var vm = kernel.Get<MainViewModel>();
Run Code Online (Sandbox Code Playgroud)
现在,我的问题:
执行ITradingApi可能需要额外的参数才能工作.
例:
本着不允许不完整对象的精神,我将这些作为参数添加到具体实现的构造函数中.
现在,我不确定,这将如何运作.显然,这些附加参数不属于接口,因为它们特定于每个实现.
另一方面,这些附加参数需要由最终用户输入然后传递给实现ITradingApi,这意味着用户ITradingApi需要对具体实现有深入了解.
如何解决这个难题?
更新:
一种方法可能是创建一个ITradingApiProvider公开所需参数列表.View可以自动为这些参数创建一个输入表单,该表单将数据绑定到参数中ITradingApiProvider.现在,当ITradingApi从提供程序请求实例时,它可以使用这些参数来创建具体实现的实例.显然执行ITradingApiProvider和ITradingApi紧密耦合,但我认为只要每个实现ITradingApi都带有相应的实现,这不是问题ITradingApiProvider.
我仍然是DI的新手,我试图理解我是否以错误的方式思考问题.当我想表示一个依赖于IRandomProvider的Die对象时,我正在解决玩具问题.那个界面很简单:
public interface IRandomProvider
{
int GetRandom(int lower, int upper);
}
Run Code Online (Sandbox Code Playgroud)
我想要一个看起来像这样的Die构造函数:
Die(int numSides, IRandomProvider provider)
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用具有如下方法的静态DIFactory:
public static T Resolve<T>()
{
if (kernel == null)
{
CreateKernel();
}
return kernel.Get<T>();
}
Run Code Online (Sandbox Code Playgroud)
CreateKernel只是绑定到IRandomProvider的特定实现.
我希望能够用以下方式调用:
DIFactory.Resolve<Die>(20);
Run Code Online (Sandbox Code Playgroud)
如果没有制作特殊版本的"Resolve",我就无法完成这项工作,这可以让我处理ConstructorArgs.这似乎使事情变得过于复杂,并且需要我为其中的每个其他实例修改DIFactory,以及绑定到构造函数参数的特定名称.
如果我重构Die类不使用int构造函数,一切正常.但现在有人必须记住初始化numSides参数,这似乎是一个坏主意,因为它是类的要求.
我怀疑这对DI来说是一个糟糕的心理模型.任何人都可以开导我吗?