- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 MVC 6 RC1 中,我们使用 IAssemlbyProvider
接口(interface)来注册在运行时发现的程序集,并在类似的 fashion to this post 中注入(inject)额外的 Controller 类型。 .. 现在随着 RC2 版本的发布,IAssemblyProvider
已被删除并更改为 (see reference) .
我们的框架版本目前是net46
。
自升级以来,我们在外部程序集(未引用)中的 Controller 正在返回 404
状态。
我们已经尝试通过 ApplicationPartManager
手动将 Controller 添加到已注册的 Controller 。
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
中,因为我们的依赖注入(inject)系统正在为外部程序集中的其他项目查找和填充服务。
在我们之前的实现中,使用 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 仍然相对较新,但如果有人有任何经验,在启动时注册额外的 Controller 会有所帮助。
干杯,尼科
最佳答案
在直接使用 ControllerFeature
一段时间后没有结果,是时候回到基础了。
基本上在应用程序启动时, Controller 被注册到到 Controller 功能容器而不是 Controller 功能。这是关键,因为您需要注册 Controller 。
我正在浏览 GitHub repository for RC2并遇到了 ControllerFeatureProvider
.如前所述。
Discovers controllers from a list of <see cref="ApplicationPart"/>
然后在 PopulateFeature
下有一个方法,我们可以看到它抓取注册到应用程序的所有部分并提取 Controller 接口(interface)(IsController()
方法)值得回顾)。
/// <inheritdoc />
public void PopulateFeature(
IEnumerable<ApplicationPart> parts,
ControllerFeature feature)
{
foreach (var part in parts.OfType<IApplicationPartTypeProvider>())
{
foreach (var type in part.Types)
{
if (IsController(type) && !feature.Controllers.Contains(type))
{
feature.Controllers.Add(type);
}
}
}
}
现在我们知道 Controller 是如何找到的,它们来自 ApplicationPart
注册到应用程序。下一个问题是我们如何创建应用程序部分。
经过一些审查并尝试使用依赖注入(inject),手动将部件添加到应用程序以注册我的部件后,我遇到了另一个概念。
界面IMvcBuilder
有扩展方法 AddApplicationPart
它将 Assembly
添加到应用程序部分。这是通过将程序集包装在 AssemblyPart
中来完成的。应用部分。在查看 AssemblyPart
时,该部分将在程序集中找到的所有类型返回到调用部分系统(在我们的示例中为 ControllerFeatureProvider
)。
/// <inheritdoc />
public IEnumerable<TypeInfo> Types => Assembly.DefinedTypes;
AssemblyPart
的一些有趣之处在于方法 GetReferencePaths()
/// <inheritdoc />
public IEnumerable<string> GetReferencePaths()
{
var dependencyContext = DependencyContext.Load(Assembly);
if (dependencyContext != null)
{
return dependencyContext.CompileLibraries.SelectMany(library => library.ResolveReferencePaths());
}
// If an application has been compiled without preserveCompilationContext, return the path to the assembly
// as a reference. For runtime compilation, this will allow the compilation to succeed as long as it least
// one application part has been compiled with preserveCompilationContext and contains a super set of types
// required for the compilation to succeed.
return new[] { Assembly.Location };
}
看来拼图的最后一 block 是在模块(或外部程序集的)project.json 文件中启用 preserveCompilationContext
。
"preserveCompilationContext": {
"type": "boolean",
"description": "Set this option to preserve reference assemblies and other context data to allow for runtime compilation.",
"default": false
}
最终实现和解决这个问题变得非常简单。我们的每个外部程序集(或模块)都通过我们的 ModuleManager
类加载。这有一个所有引用模块程序集的列表。因此,在注册 MVC 的 Startup.cs
文件中的 ConfigureServices
方法中,我们只需为每个模块程序集调用扩展方法 AddApplicationPart
as。
var mvcBuilder = services.AddMvc();
foreach(var module in ModulesManager.ReferencedModules)
{
mvcBuilder.AddApplicationPart(module.ReferencedAssembly);
}
进行这些小的更改后,我的外部 Controller 将停止返回 404
。
关于c# - 另一个程序集中的 MVC 6 RC2 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37608298/
我很好奇这两个模块在实践中有什么区别吗?如果不是,为什么会有这两个副本? 最佳答案 std::rc::Rc只是 alloc::rc::Rc 的再导出.你可以在src/std/lib.rs中看到整个rc
我注意到 rust 书推荐使用 Rc::clone(&rc)在rc.clone()如下: use std::rc::Rc; let five = Rc::new(5); // recommended
我需要将我现有的 Angular 2 RC 1 应用程序迁移到 Angular 2 RC 4。作为其中的一部分,我还需要将我现有的表单迁移到 Angular 2 RC 4 New Forms。 任何人
如何测试 Selenium RC 中哪个元素具有焦点? 最佳答案 当我遇到同样的问题时,出于各种原因,其他答案都不适合我。我最终做了以下操作(使用 Java 中的 Selenium 2.0 WebDr
Horse是一个实现 Animal 的结构特征。我有一个 Rc和一个需要接收 Rc 的函数, 所以我想从 Rc 转换至 Rc . 我这样做了: use std::rc::Rc; struct Hors
代码如下所示: // Simplified pub trait Field: Send + Sync + Clone { fn name(&self); } #[deriving(Clone)
在 /etc/rc[06].d/ 目录中的程序启动之后,系统的启动就已经完成。不过,我们总有一些程序是需要在系统启动之后随着系统一起启动的。这时我们并不需要自己把需要启动的服务链接到 /etc/rc3
我正在使用 selenium rc,我需要测试 flash。我需要单击 Flash 播放器上的允许按钮。 我只是需要一些帮助才能开始? 最佳答案 通常,除非在 Flash 开发人员的帮助下将 Sele
我知道 PhantomData旨在使用数据类型定义中的生命周期或类型参数,否则这些参数将不会被使用。我最近在查看 Rc 的定义在Rust std lib并注意到它似乎使用了 PhantomData ,
谁能给我解释一下为什么Rc<>不是 Copy ? 我正在编写使用大量共享指针的代码,并且必须输入 .clone()总是让我心烦意乱。 在我看来Rc<>应该只包含一个固定大小的指针,所以类型本身应该是
我想创建一个 Rc因为我想减少跟踪访问 Rc 的 2 个指针的间接访问需要。我需要使用 Rc因为我确实拥有共享所有权。我在 another question 中详细说明关于我的字符串类型的更具体的问题
Selenium IDE 和 Selenium RC 的功能有什么区别? 最佳答案 Selenium IDE 是一个 firefox 插件,它为您提供了用于记录测试的基本记录器。这些测试使用关键字记录
我正在尝试使用 Selenium RC (Java) 在 Paypal-Sandbox 上购买东西,但它不起作用。 我用 Selenium IDE (Firefox AddOn) 试过了,它确实有效。
我有一个 Rc>但需要得到一个Rc从中。像这样的东西: let rc_option: Rc> = Rc::new(Ok(value)); let ok_value: Rc = rc_option.ma
我知道在 matplotlib 中,您可以使用 rc 或 rcParams 来自定义绘图的样式。但是,这些函数似乎存在于两个级别,例如 matplotlib.rc 与 matplotlib.pyplo
Rust 文档涵盖 Rc>相当广泛,但不涉及 RefCell> ,我现在遇到了。 这些是否有效地给出了相同的结果?它们之间有重要区别吗? 最佳答案 Do these effectively give
我有一段代码是这样的: use std::cell::RefCell; use std::rc::Rc; struct A(bool); impl A { fn get_ref(&self)
Rust 文档涵盖 Rc>相当广泛,但不涉及 RefCell> ,我现在遇到了。 这些是否有效地给出了相同的结果?它们之间有重要区别吗? 最佳答案 Do these effectively give
我试图获得引用计数 Rc从 HashMap 并将其放入不同的容器 ( Vec )。 原以为这会起作用(通过增加引用计数),但我却收到了一个“expected struct std::rc::Rc ,
前言 我们在ubuntu下要把一个程序加入开机启动,一般可以通过修改rc.local来完成,但ubuntu下有两个rc.local文件。分别是/etc/rc.local和/etc/init.d/r
我是一名优秀的程序员,十分优秀!