加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC – 如何在整个应用程序中实例化,存储和创建

发布时间:2020-12-16 03:24:38 所属栏目:asp.Net 来源:网络整理
导读:我正在开发一个MVC应用程序来服务多个域 – 每个域都是一个大公司的分支. LocalBranch类存储详细信息,如电话,地址,电子邮件,位置坐标等. 我想为每个http请求创建一个这个类的单个实例,并让它在整个应用程序中可用 – 从控制器,视图,一些帮助程序类和其他代码
我正在开发一个MVC应用程序来服务多个域 – 每个域都是一个大公司的分支.

LocalBranch类存储详细信息,如电话,地址,电子邮件,位置坐标等.

我想为每个http请求创建一个这个类的单个实例,并让它在整个应用程序中可用 – 从控制器,视图,一些帮助程序类和其他代码.

有推荐的方法吗?

现在我将它作为BaseController上的属性并使用ViewBag将其传递给视图.但如果可能的话,我希望它强烈输入视图.

我不想把它放在一个应用程序变量中,因为我们需要为不同的域提供不同的值.

如果可能的话,我宁愿避免使用会话变量,因为我们可能会在未来扩展到使用多个服务器,而且我听说这对会话不起作用.

如果您认为有更清晰的方式来表达我所追求的内容,请随时更新标签/标题.谢谢.

解决方法

你在这里有两个问题.第一个是“如何根据HttpRequest创建此类的单个实例?”第二个是“我如何将其用于强类型视图?”

@ amir-popovich几乎已经回答了第一个使用依赖注入的问题.但是,FWIW我可能会使用Ninject而不是Unity(只是偏好,真的),我可能会以不同的方式实现它.我不会使用HttpContext,只是构建一个服务(使用Ninject的OnePerHttpRequest模块进行实例化,将域作为参数传递以获取正确的值).

然后,为了将这些LocalBranch值添加到强类型视图模型,您可以首先创建一个包含此类型的基本视图模型:

public class BaseViewModel
{
    public LocalBranch Branch {get;set;}
}

然后,使所有当前视图模型继承此基本类型

public MyViewModel : BaseViewModel
{
    public string SomeValue {get;set;}
}

然后在您的控制器中,很容易从您从第一步创建的服务中添加这些值

public ActionResult SomeAction()
{
    var vm = new MyViewModel();
    vm.Branch = LocalBranchService.GetLocalBranchValues(); //Local Branch Service has been injected with Ninject

    //do other stuff

    return View(vm);
}

但是,将其添加到每个控制器操作变得非常繁琐,因此您可以创建一个结果过滤器来为您添加它:

public class LocalBranchResultFilter : FilterAttribute,IResultFilter 
{
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
        //This method gets invoked before the ActionResult is executed.
        filterContext.Controller.ViewData.Model.Branch = LocalBranchService.GetLocalBranchValues(); //Local Branch Service has been injected with Ninject
    } 
}

现在,您可以使用过滤器装饰Controller和/或Actions(如果需要,您甚至可以在全局过滤器中设置它).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读