页面,Web服务和Web控件的公共继承

时间:2009-03-24 10:22:50

标签: c# .net asp.net

我想在c#.net 3.5 web项目中为我的网页和用户控件提供一组功能。我对页面的标准方法是创建一个“基页”,扩展System.Web.UI.Page类,然后让我的页继承自此页面,而不是直接从Page类继承。

我现在想要将这些功能中的一些暴露给我的Web控件(ascx)和Web服务。我可以想到很多方法可以做到这一点,但它们看起来有点笨拙,我想我错过了一个技巧。

是否有一种简单的方法可以使用继承为我的页面,Web服务和控件提供一些常用功能,还是需要将这些函数包装在一个所有可以访问的类中?

澄清的一个例子:

  • 我有一个处理Web应用程序大部分功能的单例。
  • 在每个请求开始时,我想检查该类是否存在于Web缓存中,如果没有则初始化。

最初,这是在所有页面使用的页面基础中处理的。现在我需要能够通过相同的检查安全地从服务和控件访问我的单例。因此,我将检查和初始化逻辑提取到另一个类中,然后我的每个基页,控件和Web服务都实例化。即使使用这个模型,我在3个地方重复相同的代码(我的每个控件,ws和页面的基类),虽然代码不多,但这似乎也错了!

它有效,但看起来很笨拙......我期待你们用你的智慧谦卑我!

3 个答案:

答案 0 :(得分:1)

听起来就像一个面向方面的编程案例。 .NET没有这方面的装备。我担心你的解决方案是最好的解决方案之一。

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

答案 1 :(得分:1)

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

    //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服务,母版页,用户控件,页面等中公开此类的单例实例。

希望这会有所帮助,但如果有更好的方法,我也会有兴趣听听。

答案 2 :(得分:1)

在您的Singleton中,您可以提供一个策略接口,以根据配置的环境允许变体代码。这将允许您在web / windows / wcf ...等之间切换。