0

我目前有一个用户控件库,我在我们的许多 Web 应用程序中使用它。我想更新这些控件,以便我可以使用 IOC 来帮助分离逻辑。

所以我会在网页本身上有类似于以下内容的内容:

<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 beta 的东西非常配合。

使用 Spring.net 处理 nHibernate 会稍微减少配置条目,并且 MVC 不使用您需要的上下文 xml(springair 是一个很好的例子)。

祝你好运

于 2009-01-05T11:55:30.230 回答
0

不幸的是,这个问题没有一个答案,许多 IOC 容器包含一些注入控件属性的实现,但是(当前)没有办法在没有无参数构造函数的情况下实际创建控件。

于 2009-10-05T08:23:52.540 回答