Webプロジェクトに配置する.NETを使用してIOCコントロールを作成できますか?
-
03-07-2019 - |
質問
現在、多くのWebアプリケーションで使用しているUserControlsのライブラリがあります。 IOCを使用してロジックを分離できるように、これらのコントロールを更新したいと思います。
そのため、Webページ自体には次のようなものがあります。
<prefix:ControlName ID="myControl" runat="server" property="value1" />
コントロールには、次のようなコンストラクタがあります。
public ControlName (IControlLogic logic)
理想的には、IOCコンテナが注入を処理します。これはできますか?もしそうなら、どのライブラリがこれを提供しますか?知っているリンクがあれば、これについて議論してください。
事前に感謝
解決 3
残念ながら、この質問に対する答えはありません。多くのIOCコンテナには、コントロールプロパティを注入する実装が含まれていますが、パラメータのないコンストラクタなしで実際にコントロールを作成する方法はありません。
他のヒント
残念なことに、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)
{
}
}
はい、できます。spring.netをご覧になることをお勧めします
http://www.springframework.net/doc-latest /reference/html/springair.html
提案しているユーザーコントロールのアイデアを維持したいかどうかはわかりません。
個人的には、spring.netとnHibernateを一緒に使用しています(ただし、現在提供されているHibernateテンプレートは使用していません)。
Spring.netを使用してnHibernateを処理すると、構成エントリがわずかに減少し、MVCは必要なコンテキストxmlを使用しません(springairは良い例です)。
幸運