如何创建一次对象并在Controller中多次使用它

时间:2018-01-05 08:31:27

标签: asp.net asp.net-mvc

我想使用Controller类中的方法填充对象。所以我在Controller类中创建了对象,然后尝试使用类中的方法填充它。但这不起作用,因为每次调用控制器中的方法时,都会重新启动整个Controller类。每次我尝试填充对象时,我都会得到一个全新的对象。但是,我不知道如何创建一个对象并填充它。我已添加以下代码。我正在谈论的对象是ProcessModel。忽略我在课程顶部创建的其他对象。

控制器:

public class HomeController : Controller
{
    ProcessModel pm = new ProcessModel();
    RetrievePatterns pt = new RetrievePatterns();
    RetrieveModel rm = new RetrieveModel();

    public IActionResult Index()
    {
        FindPatterns fp = new FindPatterns(rm.pm, pt.KpiPatterns);
        ViewData["KPIs"] = fp.passdata;
        return View();
    }

    [HttpPost]
    public IActionResult AddEvent([FromBody] Event data)
    {
        data.ID = pm.EventObjects.Count + 1;
        pm.EventObjects.Add(data);
        return Json(pm.EventObjects.Count);
    }

    [HttpPost]
    public IActionResult AddProcessName(string data)
    {
        pm.ID = 1;
        pm.Name = data;
        return Json(new { title = pm.Name });
    }

    public IActionResult About()
    {
        ViewData["Message"] = "Your application description page.";

        return View();
    }

    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }

    public ActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

对象:

public class ProcessModel
{
    public List<Event> EventObjects = new List<Event>();
    public List<Entity> EntityObjects = new List<Entity>();
    public int ID { get; set; }
    public string Name { get; set; }
}

2 个答案:

答案 0 :(得分:1)

您可以创建一个Singleton类,该类负责仅从Process模型创建一个实例;

public class ProcessModelSingleton
{
    private static ProcessModel _processModel = new ProcessModel();

    private ProcessModelSingleton()
    {

    }

    public static ProcessModel Instance
    {
        get { return _processModel; }
    }
}

然后在控制器中为其分配一个全局变量;

ProcessModel pm = ProcessModelSingleton.Instance;

修改

由所有用户共享的单例类创建实例。因此,如果您想使其与用户相关,则使用Session是最佳选择。

public ProcessModel pm {
    get
    {
        if (Session["ProcessModel"] == null)
        {
            Session["ProcessModel"] = new ProcessModel();
        }
        return (ProcessModel)Session["ProcessModel"];
    }  
}

答案 1 :(得分:1)

请记住,静态变量在该Web服务器的所有用户之间共享。因此,一个用户的请求填充到单个类中的数据可以被不同用户的请求读取/覆盖。这可能就是你所追求的,但如果没有,你应该研究会话状态。

ASP.NET Session State Overview

由于HTTP本质上是无状态的,因此不鼓励使用会话来支持我的Microsoft for Asp.NET。默认情况下,它们只对创建它们的Web服务器可见,因此如果您使用的是服务器场,则需要查看具有负载均衡器或超出proc状态的服务器关联(也称为粘性会话)(例如SQL Server或NCACHE)。

理想情况下,您的应用程序设计应该避免会话的需要,并通过cookie和/或查询字符串在请求之间仅携带必要的数据。但是对于更复杂的应用程序,这通常是不可能的,因此使用会话状态。