我正在摆弄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}}
答案 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
注册所有控制器