我需要在ASP.NET中实现经典的Factory Method模式,以动态创建服务器控件。
我发现创建.ascx控件的唯一方法是使用Page / UserControl类的LoadControl方法。然而,我发现将工厂与页面链接或将页面参数传递给工厂会很麻烦。
是否有人知道另一种创建此类控件的方法(例如我忽略的静态方法)?
感谢。
答案 0 :(得分:1)
最后,我决定将页面作为参数传递给工厂。为了更容易地调用工厂方法,我将工厂类从单例更改为公共类,并将页面传递给构造函数:
public ControlsFactory
{
private Page _containingPage;
public ControlsFactory(Page containingPage)
{
_containingPage = containingPage;
}
public CustomControlClass GetControl(string type)
{
... snip ...
CustomControlClass result = (CustomControlClass)_containingPage.LoadControl(controlLocation);
return result;
}
}
由于我必须使用工厂在每个页面上实例化许多控件,这可能是实现模式的最简洁和最有用的方法。
答案 1 :(得分:0)
打开反射器之后,在Page中使用的LoadControl函数可以在任何TemplateControl中使用。
在实际的LoadControl中使用BuildManager中的内部方法,所以我认为没有使用静态方法而不使用反射。
至少你不需要传递一个页面。子类化TemplateControl可以工作。