gpt4 book ai didi

c# - 简单注入(inject)器注入(inject) PageModel ASP.NET Core Razor 页面

转载 作者:太空狗 更新时间:2023-10-30 01:13:31 24 4
gpt4 key购买 nike

简单注入(inject)器 (SI) 文档 here显示如何将 SI 与 ASP.NET Core 集成:

private void IntegrateSimpleInjector(IServiceCollection services) {
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

services.AddSingleton<IControllerActivator>(
new SimpleInjectorControllerActivator(container));
services.AddSingleton<IViewComponentActivator>(
new SimpleInjectorViewComponentActivator(container));

services.EnableSimpleInjectorCrossWiring(container);
services.UseSimpleInjectorAspNetRequestScoping(container);
}

此示例代码展示了如何将 SI 与我们在 Razor PagesMVC 模型)集成>.

但是,这并没有将 SI 集成到 Razor Pages 中,这是随 ASP.NET Core 2.0 发布的新功能。这基本上是一个 MVVM 模型(不完全是)。

所以 Razor 页面的每个 View 都有一个 PageModel,它就像 Controller 一样。我想使用 SI 注入(inject)到此类的构造函数中。

最佳答案

我想出了一种使用简单注入(inject)器注入(inject) PageModel 构造函数的方法:

public class SimpleInjectorPageModelActivatorProvider : IPageModelActivatorProvider
{
private Container Container { get; }
public SimpleInjectorPageModelActivatorProvider(Container c) => Container = c;
public Func<PageContext, object> CreateActivator(CompiledPageActionDescriptor d) =>
_ => Container.GetInstance(d.ModelTypeInfo.AsType());
public Action<PageContext, object> CreateReleaser(CompiledPageActionDescriptor d) =>
null;
}

然后,只需添加这个新的单例注册:

private void IntegrateSimpleInjector(IServiceCollection services)
{
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

services.AddSingleton<IControllerActivator>(
new SimpleInjectorControllerActivator(container));
services.AddSingleton<IViewComponentActivator>(
new SimpleInjectorViewComponentActivator(container));

// Enables Injection into PageModel
services.AddSingleton<IPageModelActivatorProvider>(
new SimpleInjectorPageModelActivatorProvider(container));

services.EnableSimpleInjectorCrossWiring(container);
services.UseSimpleInjectorAspNetRequestScoping(container);
}

它的作用基本上是在创建 PageModel 时调用 Container.GetInstance(instanceType)

关于c# - 简单注入(inject)器注入(inject) PageModel ASP.NET Core Razor 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50065258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com