2009-01-05 111 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) 
    { 

    } 
} 
相關問題