Unfortunatley ASP.NET, похоже, не поддерживает какой-либо простой шаблон создания фабрики для элементов управления. Тем не менее, в 3.5 вы получаете очень точный контроль над реальным кодом, который среда выполнения ASP.NET генерирует для вашего файла .aspx.
Просто примените атрибуты [ControlBuilder (...)] ко всем элементам управления, которые вы хотите создать в своем контейнере. Создайте подкласс ControlBuilder и переопределите ProcessGeneratedCode, чтобы заменить конструктор вызовом вашего контейнера.
Вот простой пример:
public class ServiceProviderBuilder : ControlBuilder
{
public override void ProcessGeneratedCode(System.CodeDom.CodeCompileUnit codeCompileUnit, System.CodeDom.CodeTypeDeclaration baseType, System.CodeDom.CodeTypeDeclaration derivedType, System.CodeDom.CodeMemberMethod buildMethod, System.CodeDom.CodeMemberMethod dataBindingMethod)
{
// search for the constructor
foreach (CodeStatement s in buildMethod.Statements)
{
var assign = s as CodeAssignStatement;
if (null != assign)
{
var constructor = assign.Right as CodeObjectCreateExpression;
if (null != constructor)
{
// replace with custom object creation logic
assign.Right = new CodeSnippetExpression("("+ ControlType.FullName + ")MyContainer.Resolve<" + ControlType.BaseType.FullName + ">()");
break;
}
}
}
base.ProcessGeneratedCode(codeCompileUnit, baseType, derivedType, buildMethod, dataBindingMethod);
}
}
[ControlBuilder(typeof(ServiceProviderBuilder))]
public partial class WebUserControl1 : System.Web.UI.UserControl
{
public WebUserControl1()
{
}
protected void Page_Load(object sender, EventArgs e)
{
}
}