Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.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
C# 如何在asp.net core中startup.cs文件的configure方法中更改作用域服务的属性值_C#_Asp.net Core_.net Core - Fatal编程技术网

C# 如何在asp.net core中startup.cs文件的configure方法中更改作用域服务的属性值

C# 如何在asp.net core中startup.cs文件的configure方法中更改作用域服务的属性值,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我将在startup.cs文件中更改或向作用域服务插入一些值 这是我的密码 我正在向MyService.SomeData属性插入一个值。但是,在查看页面中,打印空值 为什么呢 Startup.cs namespace MyProject { public class Startup { . . . public void ConfigureServices(IServiceCollection services)

我将在startup.cs文件中更改或向作用域服务插入一些值

这是我的密码

我正在向MyService.SomeData属性插入一个值。但是,在查看页面中,打印空值

为什么呢

Startup.cs

namespace MyProject
{
    public class Startup
    {
        .
        .
        .
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            .
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddScoped<MyService>();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            var scope = app.ApplicationServices.CreateScope();
            var MyService = scope.ServiceProvider.GetService<MyService>();
            app.Use(async (context, next) => 
            {
                if (context.Request.Query.ContainKey("conditionKey") && context.Request.Query["conditonKey"] == "something")
                {
                    MyService.SomeData = "foo";
                }
            });
        }
    }
}
namespace MyProject.Service
{
    public class MyService
    {
        public string SomeData { get; set; } = "";
    {
}
MyView.cshtml

@inject MyProject.Service.MyService MyService
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
    <div>@MyService.SomeData</div>
</body>
@injectmyproject.Service.MyService MyService
@MyService.SomeData

ASP.NET核心管道为每个http请求创建作用域,因此您需要在操作方法中设置此属性

public class HomeController : Controller
{
    private readonly MyService myService;

    public HomeController(MyService myService)
    {
        this.myService = myService;
    }

    public IActionResult Index()
    {
        myService.MyData = "MyData";

        return View();
    }
}
或者将您的服务注册为singleton

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<MyService>();
}


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    var scope = app.ApplicationServices.CreateScope();
    var MyService = scope.ServiceProvider.GetService<MyService>();

    MyService.MyData = "SomeData";
}

多亏了@YegorAndrosov,我解决了这个问题。 在app.Use()中间件中创建请求范围的服务。并且,通过context.RequestServices.GetService()创建它

名称空间MyProject
{
公营创业
{
.
.
.
public void配置服务(IServiceCollection服务)
{
.
.
.
services.AddSingleton();
services.addScope();
}
.
.
.
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境、ILogger记录器)
{
.
.
.
应用程序使用(异步(上下文,下一步)=>
{
var RequestData=context.RequestServices.GetService();
var HompageSetting=context.RequestServices.GetService();
if(context.Request.Query.ContainKey(“conditionKey”)&&context.Request.Query[“conditonKey”]=“something”)
{
MyService.SomeData=“foo”;
}
等待下一个();
});
}
}
}

它的作用域是有限的,每个作用域都会得到一个新实例,所以这不起作用。使用工厂方法注册服务,或者将配置类型作为另一个服务依赖项注入。感谢您的回答Jeremy.yap,我将使用新实例。所以,我修改了我的代码。数据已插入app.Use()lambda。但它是一样的。@Jang HoBae如果您在使用之外创建MyService,它应该是inside@Jang-HoBae我更新了我的答案以使用
app.use()
,感谢你的回答Yegor~。是的,我将使用新实例。所以,我修改了我的代码。数据已插入app.Use()lambda。但这是一样的。你需要接受最有用的答案,或者如果没有人解决你的问题,就发表你自己的答案。请不要张贴答案的副本。
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews(x => x.Filters.Add(typeof(MyServiceFilter)));

    services.AddScoped<MyService>();
}


public class MyServiceFilter : IActionFilter
{
    private readonly MyService myService;

    public MyServiceFilter(MyService myService)
    {
        this.myService = myService;
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        myService.MyData = "MyData";
    }
}
app.Use(async (context, next) =>
{
    if (context.Request.Query.ContainsKey("conditionKey") && context.Request.Query["conditionKey"] == "something")
    {
        var myService = context.RequestServices.GetService<MyService>();

        myService.MyData = "foo";
    }

    await next();
});
namespace MyProject
{
    public class Startup
    {
        .
        .
        .
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            .
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddScoped<MyService>();
        }
        .
        .
        .
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
        {
            .
            .
            .
            app.Use(async (context, next) =>
            {
                var RequestData = context.RequestServices.GetService<RequestData>();
                var HompageSetting = context.RequestServices.GetService<HomepageSetting>();
                if (context.Request.Query.ContainKey("conditionKey") && context.Request.Query["conditonKey"] == "something")
                {
                    MyService.SomeData = "foo";
                }
                await next();
            });
        }
    }
}