我可以使用.NET创建IOC控件以放置在Web项目中吗?
-
03-07-2019 - |
题
我目前有一个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就是一个很好的例子)。
祝你好运不隶属于 StackOverflow