我有一个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;
// ...
}
// ...
}