将类感知全局函数添加到.net Web应用程序

时间:2013-02-25 14:50:23

标签: asp.net .net scope

当我开始在asp工作时,发现它几乎不可能留下php的良好的旧echo()功能 - 我的手在字面上输入它而不是response.write()

所以,在.net页面中我倾向于创建这样的东西:

Public Sub echo(ByVal strValue As String)
    Response.Write(strValue)
End Sub

在.net类(即app_code文件夹中的类)中,我倾向于创建这样的东西:

Public Sub echo(ByVal strValue As String)
    HttpContext.Current.Response.Write(strValue)
End Sub

虽然这样可以正常工作 - 但我希望将它放在应用程序级别,以便可以在任何地方使用(例如在类,aspx代码隐藏页面等中)。

Tricky位来到app_code中的类,即他们需要使用HttpContext.Current.来访问Response.Write方法。

我知道你可以通过将它作为公共类中的共享子来实现“全局”功能,但这仍然需要双桶使用(我认为?),即tools.echo()

我的问题:是否有可能拥有一个不需要包含类的全局函数,如果是这样的话,如何使它能够识别类,即如果它在一个类中使用app_code类然后需要使用HttpContext.Current.Response.Write vs代码隐藏页面直接访问Response

除了我的坏习惯,echo()实际上在代码中看起来比Response.Write()&还有一些我希望以这种方式制作全球的方法 - 因此我的问题是:)

2 个答案:

答案 0 :(得分:0)

在C#中,您无法创建顶级功能。 C#编译器开发人员Eric Lippert在this blog post中解释了原因。

  

C#旨在成为一种大规模的应用程序开发语言   从第一天开始面向专业开发者;它从来没有打算成为一个   脚本语言。因此,它的设计鼓励强制执行   立即将小块代码组织到组件中。   C#是一种面向组件的语言。因此,我们要鼓励   以基于组件的风格编程并阻止这些功能   反对那种风格。

至于你的技术问题,你必须在"你能和#34;之间作出决定。和#34;你应该"。

你可以:如果你有真正的全球性,实用的方法,我的想法是使用静态实用程序类或单例。另一个"技术"您可以这样做的方法是从object类型创建扩展方法。 小心,后者是不好的做法。

你应该:我的建议是用C#方式做C#事。

答案 1 :(得分:0)

创建“辅助”函数以接受上下文作为参数。

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        }
    }

    private void LogoutUser()
    {
        Helpers.SessionHelpers.LogoutUser(this.Context);
    }
}

internal static class SessionVariableKeys
{
    internal static readonly string USER_ID = "UserId";
}

internal static class SessionHelpers
{
    internal static void LogoutUser(System.Web.HttpContext context)
    {
        context.Session[SessionVariableKeys.USER_ID] = null;
                    /* or */
        context.Session.Remove(SessionVariableKeys.USER_ID);
                    /* or */
        context.Session.RemoveAll();
        /* and */
        /* icing on the cake */
        context.Session.Abandon();

        /*context.Response.Redirect("SomePage.aspx"); */
    }

}