Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 页面、web服务和web控件的通用继承_C#_.net_Asp.net - Fatal编程技术网

C# 页面、web服务和web控件的通用继承

C# 页面、web服务和web控件的通用继承,c#,.net,asp.net,C#,.net,Asp.net,我有一套功能,我想在我的c#.NET3.5Web项目中为我的网页和用户控件提供这些功能。我对页面的标准方法是创建一个扩展System.Web.UI.page类的“基本页面”,然后让我的页面从此类继承,而不是直接从page类继承 现在,我想向我的web控件(ascx)和web服务公开其中一些函数。我可以想出很多方法来做到这一点,但他们似乎有点笨拙,我想我错过了一个技巧 是否有一种简单的方法可以使用继承为我的页面、web服务和控件提供一些通用函数,或者是否需要将这些函数封装在一个所有函数都可以访问的

我有一套功能,我想在我的c#.NET3.5Web项目中为我的网页和用户控件提供这些功能。我对页面的标准方法是创建一个扩展System.Web.UI.page类的“基本页面”,然后让我的页面从此类继承,而不是直接从page类继承

现在,我想向我的web控件(ascx)和web服务公开其中一些函数。我可以想出很多方法来做到这一点,但他们似乎有点笨拙,我想我错过了一个技巧

是否有一种简单的方法可以使用继承为我的页面、web服务和控件提供一些通用函数,或者是否需要将这些函数封装在一个所有函数都可以访问的类中

举例说明:

  • 我有一个处理web应用程序大部分功能的单例程序
  • 在每个请求开始时,我希望检查该类是否存在于web缓存中,如果不存在,则对其进行初始化
最初,这是在所有页面都使用的页面库中处理的。现在,我需要能够使用相同的检查,从服务和控件安全地访问我的singleton。因此,我将检查和初始化逻辑提取到另一个类中,然后我的每个基页、控件和web服务都将实例化。即使使用这个模型,我也在3个地方重复了相同的代码(我的控件、ws和页面的每个基类),尽管代码不多,但这似乎也是错误的


这很管用,但看起来很笨拙……我期待你们用你们的智慧让我谦卑

听起来像是面向方面编程的例子。NET对此装备不足。恐怕你的解决方案是最好的


或者,您可以将所有或部分函数移动到一个静态类/单例,然后从您的aspx/ascx/asmx使用该类?继承的方式不多,但至少减少了代码重复。

我的解决方案是将我想要共享的所有方法和函数都放在我的基本母版页类中。然后,我在用户控件基类中为每个方法和函数设置一个等价项,如下所示:

    //Property in masterpage base
    public string QsSearchTerm
    {
        get
        {
            if (!String.IsNullOrEmpty(Request.QueryString["q"]))
            {
                return Helpers.SanitiseString(Server.UrlDecode(Request.QueryString["q"]));
            }
            return String.Empty;
        }
    }

    //Property in usercontrol base
    public string QsSearchTerm
    {
        get
        {
            if (Page.Master is BaseMasterPage)
            {
                return ((BaseMasterPage)Page.Master).QsSearchTerm;
            }
            return string.Empty;
        }
    }
这没有帮助的是您对web服务基类的代码重复。我认为,将上述内容重构成一个具有接受HttpContext实例的构造函数的类将是前进的方向。然后,可以在基本web服务、母版页、用户控件、页面等中公开此类的单例实例


希望这能有所帮助,但我也很想知道是否有更好的方法。

在您的Singleton中,您可以提供一个策略界面,允许根据配置的环境更改代码。这将允许您在web/windows/wcf…等之间切换。

我认为使用基本页面是正确的方法

我有多个基本页和自定义用户控件,根据当前页使用的基本页不同,它们的加载方式也不同

在自定义用户控件中,可以使用以下内容:

if (this.Page is BasePageName)
{
    BasePageName bp = (BasePageName)this.Page;
    bp.BasePageFunction();
}
不,您可以在自定义用户控件中使用重复代码,只需从基本页调用它


根据页面功能和需要,您还可以拥有继承的基本页面的层次结构。BasePageName 2:BasePageName

这都是明智的建议。就我所知,没有一个我不知道的“通用”解决方案可以解决这个问题。谢谢大家的意见。