Asp.net core ASP.NET Core 5如何在_ViewImports.cshtml中插入动态类型对象
当我尝试在我的_ViewImports.cshtml中执行此操作时Asp.net core ASP.NET Core 5如何在_ViewImports.cshtml中插入动态类型对象,asp.net-core,dependency-injection,Asp.net Core,Dependency Injection,当我尝试在我的_ViewImports.cshtml中执行此操作时 @inject dynamic ResourceManager; 我可以在我的视图中使用它,如下所示: Some text @ResourceManager.MyRuntimeBoundProperty some more text 但是,当我尝试运行此解决方案时,会出现以下异常: System.InvalidOperationException:尚未注册类型为“System.Object”的服务。来源:Microsoft.
@inject dynamic ResourceManager;
我可以在我的视图中使用它,如下所示:
Some text @ResourceManager.MyRuntimeBoundProperty some more text
但是,当我尝试运行此解决方案时,会出现以下异常:
System.InvalidOperationException:尚未注册类型为“System.Object”的服务。来源:Microsoft.Extensions.DependencyInjection.Abstractions
堆栈跟踪:
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) in /_/src/libraries/Microsoft.Extensions.DependencyInjection.Abstractions/src/ServiceProviderServiceExtensions.cs:line 59
我希望避免为ResourceManager指定实际类型,因为它的属性是在运行时设置的,可能会有很大的变化
有没有办法在_ViewImports.cshtml中指定一个动态对象,或者在我的所有视图中访问一个动态填充的ResourceManager?您不能将动态与依赖项注入一起使用,因为DI使用类型作为主要机制来确定应该将哪些实例注入到依赖组件中。因此,如果您想在这里使用依赖项注入,您将需要使用一些静态类型 一种方法是引入一个静态类型的包装器对象,然后提供对动态对象的访问。例如,类似这样的事情:
公共类ResourceManagerRapper
{
公共动态资源{get;set;}
}
如果将其注册为作用域依赖项或单例依赖项,则可以将其较早地注入管道中,将资源
对象设置为动态资源管理器,然后在视图中访问它:
@{
dynamic resourceManager = ViewData["ResourceManager"];
}
@inject resourceManager Rapper resourceManager
Some text@resourceManager.Resources.MyRuntimeBoundProperty更多文本
另一种解决方案是在这里不使用依赖项注入,而是将此动态资源管理器直接传递到视图中。您可以通过视图模型或使用Razor视图中可用的机制来实现这一点。这样,您就可以设置一些ViewData[“ResourceManager”]
,然后在视图中加载该值:
@{
dynamic resourceManager = ViewData["ResourceManager"];
}
您也可以在
\u ViewStart.chtml
中执行此操作,以便它在默认情况下在所有视图中运行。您不能使用动态类型注入某些内容,因为对于依赖项注入,实际类型决定将注入何种依赖项。因此,您将需要一些静态类型;否则,系统如何知道在这里注入什么?它可以注入一个字符串来满足这个要求,这显然不适合您那么您实际上想在这里注入什么呢?原始代码(ASP.NET Framework 4.7.2)有一个视图基类,它提供了一个动态资源管理器。我需要在ASP.NET Core 5迁移中使用一个动态资源管理器来实现这一点。我已经做出了妥协,为ResourceManager提供了一个具体的类型,然后在使用时将其强制转换为dynamic,然后从dynamic强制转换中访问各种属性名称。我不知道这是否真的会起作用,因为我没有运行那段代码。我怀疑它会,但目前还不能证实。谢谢你的建议。这也证实了我的想法。不过,经典的ASP.NET并没有使用依赖注入。如果您想传递一个动态对象,我建议您将其作为传递。您可以在控制器中设置它,或者甚至在\u ViewStart.cshtml
中准备它,以便它在任何地方都可用。除此之外,您还可以插入一个类型正确的对象,该对象本身具有一个动态属性,您可以使用该属性访问此ressource管理器。我会和我们的团队讨论的!接下来:我使用了Poke的想法,创建了一个具有动态属性的正确类型的对象,这就是我用来访问资源的方法。很好!Poke,如果你想把它作为你的答案,我会把它标记为答案,你可以得到你的信任:-)一个美丽而有用的答案!非常感谢你!