用户控件的工厂模式

时间:2010-02-10 18:42:32

标签: c# asp.net user-controls factory

我创建了一个ASP.NET用户控件,并且希望使用允许通过多个参数创建控件的方法创建工厂。

最初我打算在用户控件上有一个带有参数的构造函数,但实际上只提供了参数,以便从一些我不想显着改变的遗留代码中更容易地创建用户控件。我决定在工厂类中使用遗留代码可以使用的方法,这样我就不会混淆用户控件的界面。

我遇到的问题是我无法从工厂类引用用户控件类(因为通常通过添加<%@ Reference Control="~/SomeControl.ascx" %>以编程方式引用用户控件,但工厂类不是asp页面。 / p>

在旁注中,我将调用页面传递对自身的引用,以便工厂方法可以调用LoadControl,但我仍然需要能够声明SomeControl变量,但它不能。

如何为用户控件创建工厂?

1 个答案:

答案 0 :(得分:1)

声明性编程(为其设计了用户控件)不能很好地转换为命令式对象构造。为什么不创建一个适配器用户控件(或服务器控件),使旧版代码更容易使用SomeControl?如下所示。假设我们有一个遗留页面,它在SqlDateTime方面有很多逻辑,我们编写了一些新的控件,可以用普通的DateTime来完成它的工作。

LegacyPage.aspx:

<%@ Page Language="C#" AutoEventWireup="true"  %>
<%@ Register Src="~/SomeControlLegacyAdapter.ascx" TagName="SomeControlLegacyAdapter" TagPrefix="test" %>
<script type="text/C#" runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        SomeControlLegacyAdatper1.Time = new System.Data.SqlTypes.SqlDateTime(DateTime.Now);
    }
</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <test:SomeControlLegacyAdapter runat="server" ID="SomeControlLegacyAdatper1" />
    </div>
    </form>
</body>
</html>

SomeControlLegacyAdapter.ascx

<%@ Control Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Data.SqlTypes"%>
<%@ Register Src="~/SomeControl.ascx" TagPrefix="test" TagName="SomeControl" %>

<script type="text/C#" runat="server">
    public SqlDateTime Time
    {
        get { return SomeControl1.Time; }
        set { SomeControl1.Time = (DateTime)value; }
    }
</script>

<test:SomeControl ID="SomeControl1" runat="server" />

SomeControl.aspx

<%@ Control Language="C#" AutoEventWireup="true" %>
<script type="text/C#" runat="server">
    public DateTime Time
    {
        get { return string.IsNullOrEmpty(output.Text) ? DateTime.MinValue : DateTime.Parse(output.Text); }
        set { output.Text = value.ToString(); }
    }
</script>

<asp:Literal runat="server" id="output" />

旧版适配器将SomeControl转换为更易于LegacyPage使用的表单。