LightInject IoC容器在fallback方法中抛出stackoverflow

时间:2015-04-29 13:11:05

标签: ioc-container light-inject

我正在摆弄LightInject尝试建立一个包含Domain proj,Infrastructure proj,MVC proj和DependencyResolution proj的IoC解决方案。 Infrastructure,MVC和DependencyResolution引用Domain。 MVC引用DependencyResolution和DependencyResolution引用LightInject。

这个想法是DependencyResolution在app启动时注册所有必要的依赖项。它目前不了解MVC项目中的控制器。相反,我设置了一个回退例程来捕获所有未知的MVC Controller类。在回退例程中,我然后注册MVC控制器并将其返回。通过这样做,我希望这个代码只运行一次,因为它只是第一次命中MVC控制器尚未注册。但这种情况并非如此。相反,我得到一个StackOverflowException,因为每次要求MVC控制器时都会命中回退例程,即使它是第一次注册的。

所以问题是为什么会发生这种情况?这是预期的行为,如果是这样,为什么会这样,以及如何绕过它?

修改:以下是源代码。

{{1}}

1 个答案:

答案 0 :(得分:1)

RegisterFallback方法需要 factory 作为第二个参数,并且似乎没有以容器可以解析它的方式注册该类型。

您的工厂需要新建实例并将其传回。

Func<ServiceRequest, object> fallback = request =>
{
    if (request.ServiceType == typeof(XYZController))
    {
        return new XYZController(container.GetInstance<IDependency>());
    }
    else
    {
        throw new InvalidOperationException(request.ServiceType.FullName);
    }
};

这可能是issue值得开发者提升的。

您可以使用以下代码加载MVC程序集:

private IEnumerable<Assembly> LoadAssemblies(string folder)
{
    var dlls =
        from file in new DirectoryInfo(folder).GetFiles()
        where file.Extension == ".dll"
        select file.FullName;

    var assemblies = new List<Assembly>();

    foreach (string dll in dlls) {
        try {
            assemblies.Add(Assembly.LoadFile(dll));
        }
        catch { }
    }

    return assemblies;
}

使用LightInject MVC Integration Package

注册所有控制器