我可以在 MVC 后端创建一个无状态静态类吗?



我有一个MVC应用程序,其中包含一个静态类,为程序的其余部分提供布尔值。我的问题是我希望布尔值在每次调用后端时重置。我希望它是"无状态的",为每个后端调用初始化为 false。然后,我将根据需要将其设置为 true。例如,考虑以下内容,从Index视图中加载About视图,然后加载Contact视图......

public static class BooleanProvider
{
public static bool theBool = false;
}
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
BooleanProvider.theBool = true;
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
//I want BooleanProvider.theBool to be false here, since it's a different call, even though we set it to true in the About() method
return View();
}
}

当我在注释行检查BooleanProvider.theBool时,它设置为 true。有没有办法在每次调用时"重新初始化"布尔值?我宁愿不使类可实例化,并且必须通过每个控制器调用来更新它,但也许没有其他方法?

提前谢谢你!

为此,您必须使用依赖注入。

点网核心解决方案

作用域生存期正是您所需要的。 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1#scoped

在您的创业公司.cs

public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddScoped<BooleanProvider>();
// ...
}

并在您的家庭控制器

public class HomeController : Controller
{
private readonly BooleanProvider _booleanProvider;
public HomeController (BooleanProvider booleanProvider){
_booleanProvider = booleanProvider;
// ...
}
// ...
}

非核心解决方案

如果您不使用dotnetcore https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency-injection,则这是指南

PerRequestLifetimeManager是你在这里需要的

Install-Package Unity.Mvc3

在Global.asax

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);

Bootstrapper.Initialise();
}
public static class Bootstrapper
{
public static void Initialise()
{
var container = BuildUnityContainer();

DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}

private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();

Func<LifetimeManager> LM = () => { return new PerRequestLifetimeManager(); };
container.RegisterType<IBooleanProvider, BooleanProvider>(LM());

return container;
}
}
public class HomeController : Controller
{
private readonly IBooleanProvider _booleanProvider;
public HomeController (IBooleanProvider booleanProvider){
_booleanProvider = booleanProvider;
// ...
}
// ...
}

相关内容

最新更新