【问题标题】:Common inheritance for pages, web services and web controls页面、Web 服务和 Web 控件的通用继承
【发布时间】:2009-03-24 10:22:50
【问题描述】:

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

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

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

举例说明:

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

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

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

【问题讨论】:

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

标签: c# .net asp.net


【解决方案1】:

听起来像是面向方面编程的一个案例。 .NET 对此毫无准备。恐怕您的解决方案是最好的解决方案之一。

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

【讨论】:

    【解决方案2】:

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

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

    希望这会有所帮助,但如果有更好的方法,我也很想知道。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我认为使用 BasePage 是正确的方法。

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

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

        if (this.Page is BasePageName)
        {
            BasePageName bp = (BasePageName)this.Page;
            bp.BasePageFunction();
        }
        

        不,您可以摆脱自定义用户控件中的重复代码,只需从基本页面调用它。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-13
          • 2010-11-10
          • 2011-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-22
          • 2017-03-05
          相关资源
          最近更新 更多