2009-01-05 78 views
0

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

所以我也有类似的网页本身下面的内容:

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

而且控制将具有类似构造函数:

public ControlName (IControlLogic logic) 

然后理想IOC容器会处理注射。这可以做到吗?如果是这样,图书馆提供这个?如果你有任何你知道的链接,那么他们会非常感谢。

在此先感谢

回答

0

不幸的是,没有人回答这个问题,许多IOC容器包含注射控制特性的一些实现,但也没有办法,而不实际创建一个控制的(目前)一个无参数的构造函数。

1

是的,你可以,我建议你看看spring.net

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

我不知道,如果你想保持你所提出的建议的用户控件的想法。

就我个人而言,我一起使用spring.net和nHibernate(虽然避免了当前提供的Hibernate模板),它正在与.net MVC测试版一起工作。

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

好运

+0

不幸的是,我们在这个库中有很多用户控件,所以它不能直接移植到MVC中。并用构造函数注入用户控件不起作用,但我已经计算出我将相关信息/行为注入到字段中。 – 2009-01-05 16:28:01

2

Unfortunatley 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) 
    { 

    } 
} 
相关问题