无法在Simple Injector中注入IEnumerable <t> </t>

时间:2015-02-27 23:33:58

标签: c# 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返回每个类IConfigTab的类的实例。

1 个答案:

答案 0 :(得分:1)

刚刚找到答案。

// 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),并向其传递实施类型列表。