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

所以我会在网页上有类似的内容:

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

控件的构造函数类似于:

public ControlName (IControlLogic logic)

然后理想情况下,IOC容器将处理注入。可以这样做吗?那么图书馆提供的是什么?如果你有任何你知道的链接讨论这个,那将非常感谢。

提前致谢

有帮助吗?

解决方案 3

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

其他提示

Unfortunatley ASP.NET似乎不支持任何简单的工厂创建模式的控件。但是,在3.5中,您可以对ASP.NET运行时为.aspx文件生成的实际代码进行非常精细的控制。

只需将[ControlBuilder(...)]属性应用于您希望容器构建的所有控件。 Subclass 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模板),这与.net MVC beta的内容非常相似。

使用Spring.net来处理nHibernate会略微减少配置条目,而MVC不会使用你需要的上下文xmls(springair就是一个很好的例子)。

祝你好运

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top