Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.NET Core 5如何在_ViewImports.cshtml中插入动态类型对象_Asp.net Core_Dependency Injection - Fatal编程技术网

Asp.net core ASP.NET Core 5如何在_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.

当我尝试在我的_ViewImports.cshtml中执行此操作时

@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,如果你想把它作为你的答案,我会把它标记为答案,你可以得到你的信任:-)一个美丽而有用的答案!非常感谢你!