残念ながら、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)
{
}
}