无法在简单注入器中注入 IEnumerable<T>

Unable to inject IEnumerable<T> in Simple Injector

我有一个名为 IConfiTab 的接口,它将在我的代码的各个位置实现。

我希望代码能够做到这一点...

// Add all IConfig instances as user controls to the settings tabs if they are 
// configured to do so
foreach (var configTab in _configTabs)
{
    if (configTab.ShowTab)
    {
        //add Config Tab instance to GUI here
    }
}

_configTabs 应该是找到的每种 IConfigTab 实例的某种集合。

我使用以下代码尝试注册所有找到的 IConfigTab 类型。

// Register all IConfigTabs we find in the current runtime 
var iconfigTypes = 
    from nd in AppDomain.CurrentDomain.GetAssemblies()
    from type in nd.GetExportedTypes()
    where !type.IsAbstract
    where typeof(IConfigTab).IsAssignableFrom(type)
    select type;

foreach (var iconfigType in iconfigTypes)
{
    container.Register(iconfigType);
}

container.Verify();

var configTabs = container.GetInstance<IEnumerable<IConfigTab>>().ToArray();

问题是 configTabs 的大小为 0。

这可以吗?我希望 Simple Injector return 每个 class 类型 IConfigTab 的一个实例。

刚刚找到答案。

// Simple Injector v3.x syntax
container.RegisterCollection(typeof(IConfigTab),
    AppDomain.CurrentDomain.GetAssemblies());

// Simple Injector v2.x syntax
// Register all IConfigTabs we find in the current runtime 
var iconfigTypes =
    from assembly in AppDomain.CurrentDomain.GetAssemblies()
    from type in assembly.GetExportedTypes()
    where !type.IsAbstract
    where typeof(IConfigTab).IsAssignableFrom(type)
    select type;

container.RegisterAll(typeof(IConfigTab), iconfigTypes);

您必须使用 RegisterCollection 并指定服务类型(在本例中为 IConfigTab)并向其传递实施类型列表。