配置Ninject返回结果列表 [英] Configuring Ninject to return a list of results
问题描述
我正在使用Ninject来解决依赖关系,并且它一直运转到现在.在此示例中,我实际上需要一个基于存储在App.config中的数据初始化的对象的列表.
I'm using Ninject to resolve dependencies and it's working swimmingly until now. In this example, I actually need a list of objects initialized based on data stored in my App.config.
但是,Ninject一直返回一个空列表.下面的代码段是我尝试过的一个示例.在某些上下文中,我包括了类层次结构的构造函数.
However, Ninject keeps returning an empty list. The snippet below is an example of what I tried. I've included the constructors for the class hierarchy for some context.
public ServiceSchedulerBuilder(IList<ITextExportService> textExportServices)
{
_textExportService = textExportServices;
}
public TextExportService(IHotFolderManager hotFolder)
{
_hotFolder = hotFolder;
}
public HotFolderManager(string baseFolderPath, string defaultFileSearchPattern)
{
//Some IO
}
//In a Ninject AppModule...
Kernel.Bind<IList<ITextExportService>>().ToMethod(ctx =>
{
var services = new List<ITextExportService>();
foreach (var device in GetDevicesByEnvironment())
{
var service = ctx.Kernel.Get<ITextExportService>(new ConstructorArgument("hotFolder", ctx.Kernel.Get<IHotFolderManager>(
new ConstructorArgument("baseFolderPath", device.Path),
new ConstructorArgument("defaultFileSearchPattern", "*.jmf"))));
services.Add(service);
}
return services;
});
我怀疑这全都源于我没有为ITextExportService本身明确注册绑定的事实.但是,由于实现方式将依赖于App.config中的数据,因此我无法理解如何注册它,而且每次请求该类型的列表时都不会接收到相同的实例.
I suspect this all stems from the fact that I don't explicitly have a binding registered for ITextExportService itself. But since the implementation is going to be dependent on data from App.config, I can't understand how I could register it and not just receive the same instance every time when I ask for a list of that type.
推荐答案
Related: Ninject different behaviour between Kernel.Get and Constructor Injection
--> there's a mismatch with how ninject behaves when doing kernel.Get<IList<T>>
and resolving an IList<T>
parameter of a ctor.
就这样:
ninject的多次注入功能在此优先.每当ninject遇到对IEnumerable<T>
,IList<T>
或T[]
的请求(但不是AFAIR而不是ICollection<T>
)时,它将将其转换为解析T
的所有绑定(无条件或具有匹配条件)的请求.
ninject's multi injection feature takes priority here. Whenever ninject encounters a request for IEnumerable<T>
, IList<T>
or T[]
(but AFAIR not ICollection<T>
) it will translate it to a request to resolve all bindings (without condition or with a matching condition) for T
.
尝试以下操作:
public interface INoMultiBindingList<T> : IList<T> { }
public class NoMultiBindingList<T> : List<T>, INoMultiBindingList<T> { }
具有:
sbb公共ServiceSchedulerBuilder(INoMultiBindingList textExportServices)
{
textExportService = textExportServices;
}
sbb public ServiceSchedulerBuilder(INoMultiBindingList textExportServices)
{
textExportService = textExportServices;
}
Kernel.Bind<INoMultiBindingList<ITextExportService>>().ToMethod(ctx =>
{
var services = new NoMultiBindingList<ITextExportService>();
foreach (var device in GetDevicesByEnvironment())
{
var service = ctx.Kernel.Get<ITextExportService>(new ConstructorArgument("hotFolder", ctx.Kernel.Get<IHotFolderManager>(
new ConstructorArgument("baseFolderPath", device.Path),
new ConstructorArgument("defaultFileSearchPattern", "*.jmf"))));
services.Add(service);
}
return services;
});
这篇关于配置Ninject返回结果列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!