配置 Ninject 到 return 结果列表
Configuring Ninject to return a list of results
我正在使用 Ninject 来解决依赖关系,到目前为止它一直在顺畅地工作。在这个例子中,我实际上需要一个根据存储在 App.config.
中的数据初始化的对象列表
然而,Ninject 不断返回一个空列表。下面的代码片段是我尝试过的示例。我为某些上下文包含了 class 层次结构的构造函数。
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 的数据,我无法理解如何注册它,而不是每次请求该类型的列表时都收到相同的实例。
相关:
--> 在执行 kernel.Get<IList<T>>
和解析 ctor 的 IList<T>
参数时,ninject 的行为不匹配。
所以这里是:
ninject 的 multi injection 功能在这里优先。每当 ninject 遇到 IEnumerable<T>
、IList<T>
或 T[]
的请求(但 AFAIR 不是 ICollection<T>
)时,它会将其转换为解析所有绑定的请求(没有条件或具有匹配条件)for T
.
尝试以下操作:
public interface INoMultiBindingList<T> : IList<T> { }
public class NoMultiBindingList<T> : List<T>, INoMultiBindingList<T> { }
与:
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 来解决依赖关系,到目前为止它一直在顺畅地工作。在这个例子中,我实际上需要一个根据存储在 App.config.
中的数据初始化的对象列表然而,Ninject 不断返回一个空列表。下面的代码片段是我尝试过的示例。我为某些上下文包含了 class 层次结构的构造函数。
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 的数据,我无法理解如何注册它,而不是每次请求该类型的列表时都收到相同的实例。
相关:kernel.Get<IList<T>>
和解析 ctor 的 IList<T>
参数时,ninject 的行为不匹配。
所以这里是:
ninject 的 multi injection 功能在这里优先。每当 ninject 遇到 IEnumerable<T>
、IList<T>
或 T[]
的请求(但 AFAIR 不是 ICollection<T>
)时,它会将其转换为解析所有绑定的请求(没有条件或具有匹配条件)for T
.
尝试以下操作:
public interface INoMultiBindingList<T> : IList<T> { }
public class NoMultiBindingList<T> : List<T>, INoMultiBindingList<T> { }
与:
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;
});