Webプロジェクトに配置する.NETを使用してIOCコントロールを作成できますか?

StackOverflow https://stackoverflow.com/questions/412859

質問

現在、多くの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は良い例です)。

幸運

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top