【发布时间】:2017-07-26 13:04:00
【问题描述】:
在 MVC 6 RC1 中,我们使用 IAssemlbyProvider 接口来注册在运行时发现的程序集并注入其他控制器类型,类似的 fashion to this post.. 现在随着 RC2 版本的发布,IAssemblyProvider 已被删除并已更改到(see reference)。
我们的框架版本目前是net46。
自升级以来,我们在外部程序集中(未引用)的控制器正在返回 404 状态。
我们已尝试通过ApplicationPartManager 手动将控制器添加到已注册的控制器中。
var mvcBuilder = services.AddMvc();
var controllerFeature = new ControllerFeature();
mvcBuilder.PartManager.PopulateFeature(controllerFeature);
var moduleControllers = ModulesManager.GetControllers();
foreach (var c in moduleControllers)
controllerFeature.Controllers.Add(c);
mvcBuilder.PartManager.PopulateFeature(controllerFeature);
还有……
services.AddMvc().ConfigureApplicationPartManager(app =>
{
var controllerFeature = new ControllerFeature();
app.PopulateFeature(controllerFeature);
var moduleControllers = ModulesManager.GetControllers();
foreach (var c in moduleControllers)
controllerFeature.Controllers.Add(c);
app.PopulateFeature(controllerFeature);
});
现在程序集肯定会加载到AppDomain,因为我们的依赖注入系统正在为外部程序集中的其他项目查找和填充服务。
在我们之前的实现中,使用 IAssemblyProvider 可以很好地工作。
public class ModuleAwareAssemblyProvider : IAssemblyProvider
{
private readonly DefaultAssemblyProvider _defaultProvider;
public ModuleAwareAssemblyProvider(DefaultAssemblyProvider defaultProvider)
{
_defaultProvider = defaultProvider;
}
public IEnumerable<Assembly> CandidateAssemblies
{
get
{
return _defaultProvider.CandidateAssemblies.Concat(ModulesManager.Assemblies).Distinct();
}
}
}
我知道 RC2 仍然相对较新,但如果有人有在启动时注册额外控制器的经验会有所帮助。
干杯,尼科
【问题讨论】:
标签: c# asp.net-core-mvc