在我的应用程序中,我可以按名称注册不同的数据源。这些数据源每个都需要一些string
属性,以及一组其他依赖项,但在其他方面是相同的,因此请采用一些不同的标准实现。
要在请求时构造每个数据源的实例,我会创建一个Provider<T>
实例的绑定,该实例使用访问该数据源所需的信息进行初始化。提供者看起来如下所示:
public class StandardListProvider<T> : Provider<IListExecutor<T>>
where T : new()
{
public string Name { get; set; }
public string ListMethod { get; set; }
public StandardListProvider(string name, string listMethod)
{
Name = name;
ListMethod = listMethod;
}
protected override IListExecutor<T> CreateInstance(IContext context)
{
var connector = (IInternalConnector)context.Kernel.GetService(typeof(IInternalConnector));
return new StandardListExecutor<T>(connector, Name)
{
ListMethodName = ListMethod
};
}
}
问题在于解决StandardListExecutor<T>
IInternalConnector
之类的依赖关系。显然我可以手动构建它们,或者像context.Kernel
那样从我StandardListExecutor
中请求它们(并由Ninject Providers -> Get another dependency inside the provider建议),但是这会导致请求没有目标信息,如果我们这样做不理想想要为context.Request.CreateChild(...)
的依赖关系执行上下文绑定。
我已尝试使用ParameterTarget
,但这似乎需要反映每次激活以创建{{1}}。在Ninject文档中似乎没有关于此的更多信息。
我的问题是:在现有绑定的激活过程中,解决/请求依赖关系或其他类似服务的正确方法是什么?
修改
请求本身是通过Ninject.Mvc连接进入System.Web.Mvc控制器激活过程。
答案 0 :(得分:0)
您应该可以使用扩展程序Ninject.Extensions.ContextPreservation。特别是扩展方法IContext.ContextPreservingGet(...)
:
var connector = context.ContextPreservingGet<IInternalConnector>();
但是,我个人认为创建特定的设置类型是更好的选择 - 因为它是更简单的想法。