簡體   English   中英

在ASP.NET MVC中使用全局變量

[英]Use global variable in ASP.NET MVC

首先看示例控制器代碼。 在這里,您會發現兩個重復的語句-

public class DashboardController : Controller
{
    //the following line is repetitive for every controller.
    String ConnectionString = WebConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    public ActionResult Index()
    {
        try
        {
            //codes
        }
        catch (Exception Ex)
        {
            //The following line is repetitive for every action method.
            var path = HttpContext.Server.MapPath("~/App_Data");
            ExceptionLog.Create(Ex, path);
        }
        return View("AdminDashboard");
    }
}

我想避免這種重復。 有什么方法可以作為全局變量在整個應用程序中使用嗎?

如果是我,並且需要訪問頻繁的配置選項,那么我將創建/公開某種IAppConfiguration ,可以將其放入控制器中(使用依賴項注入)。 就像是:

public interface IAppConfguration
{
    String MyConnectionString { get; }
    String ServerPath { get; }
}
public class AppConfiguration : IAppConfiguration
{
    private readonly HttpContext context;
    public AppConfiguration(HttpContext context)
    {
        this.context = context;
    }

    public String MyConnectionString
    {
        get { return COnfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
    }
    public String ServerPath
    {
        get { return context.Server.MapPath("~/"); }
    }
}

然后,您可以針對不同的情況,子站點/區域等擴展它。然后,通過控制器的構造函數將其引入:

public class MyController : Controller
{
    private readonly IAppConfiguration config;
    public MyController()
        : this(new AppConfiguration(HttpContext.Current))
    {
    }
    public MyController(IAppConfiguration config)
    {
        this.config = config;
    }

    // reference config.ServerPath or config.MyConnectionString;
}

更進一步,您可以在此基礎上添加一個工廠,將其作為參考,並允許您獲取其他環境的配置設置。 例如

IAppConfiguration config = configFactory.GetConfig(/* environment */);

我喜歡這種方法的地方是讓我可以將設置替換為本地[單元/集成]測試。 使用基本控制器/靜態類將使以后很難替換這些值。

這是使用基本控制器方法的示例:

public abstract class BaseController : Controller
{
    protected string ConnectionString = WebConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

    protected void LogException(Exception ex)
    {
        var path = HttpContext.Server.MapPath("~/App_Data");
        ExceptionLog.Create(Ex, path);
    }    
}

public class DashboardController : BaseController
{
    public ActionResult Index()
    {
        try
        {
            string conn = base.ConnectionString;
            //codes
        }
        catch (Exception ex)
        {
            base.LogException(ex);
        }
        return View("AdminDashboard");
    }
}

為了避免捕獲異常,您可以將其記錄在global.asax.cs的OnError事件處理程序中:

protected void Application_Error(object sender, EventArgs e)
{
    HttpContext ctx = HttpContext.Current;

    Exception ex = ctx.Server.GetLastError();

    var path = HttpContext.Server.MapPath("~/App_Data");
    ExceptionLog.Create(Ex, path);
}

傳遞給dbcontext或ADO Connection時,可以使用連接字符串名稱“ MyConnectionString”代替WebConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString ConnectionString。

但是更正確的方法是在控制器類中注入(使用依賴注入),該類將負責與數據庫一起工作,而不是在控制器中創建數據庫並將其傳遞給連接字符串。

您可以繼承控制器,然后將其用於所有其他控制器,看看類似的問題。 如何繼承ASP.NET MVC控制器並僅更改視圖?

但這只能在控制器中訪問,您還可以使用靜態方法或屬性創建一個返回連接字符串的類。 可以在您有權訪問該類的任何代碼路徑中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM