0

現在、多くの Web アプリケーションで使用する UserControls のライブラリがあります。これらのコントロールを更新して、IOC を使用してロジックを分離できるようにしたいと考えています。

したがって、Web ページ自体に次のようなものがあります。

<prefix:ControlName ID="myControl" runat="server" property="value1" />

コントロールには、次のようなコンストラクターがあります。

public ControlName (IControlLogic logic)

理想的には、IOC コンテナがインジェクションを処理します。これはできますか?もしそうなら、どのライブラリがこれを提供していますか? これについて話し合っていることを知っているリンクがあれば、大いに感謝します。

前もって感謝します

4

3 に答える 3

2

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

    }
}
于 2009-03-03T22:56:10.127 に答える
1

はい、できます。spring.net をご覧になることをお勧めします。

http://www.springframework.net/doc-latest/reference/html/springair.html

あなたが提案しているユーザーコントロールのアイデアを維持したいかどうかはわかりません。

個人的には、spring.net と nHibernate を一緒に使用しています (ただし、現在提供されている Hibernate テンプレートは避けています)。これは、.net MVC ベータ版とうまく連携しています。

Spring.net を使用して nHibernate を処理すると、構成エントリがわずかに減少し、MVC は必要なコンテキスト xml を使用しません (springair が良い例です)。

幸運を祈ります

于 2009-01-05T11:55:30.230 に答える
0

残念ながら、この質問に対する答えは 1 つではありません。多くの IOC コンテナーには、コントロール プロパティを挿入する実装が含まれていますが、パラメーターのないコンストラクターなしで実際にコントロールを作成する方法は (現在) ありません。

于 2009-10-05T08:23:52.540 に答える