我可以使用.NET创建IOC控件以放置在Web项目中吗?
我目前有一个UserControls库,我在很多Web应用程序中使用它。我想更新这些控件,以便我可以使用IOC来帮助分离逻辑。我可以使用.NET创建IOC控件以放置在Web项目中吗?
所以我也有类似的网页本身下面的内容:
<prefix:ControlName ID="myControl" runat="server" property="value1" />
而且控制将具有类似构造函数:
public ControlName (IControlLogic logic)
然后理想IOC容器会处理注射。这可以做到吗?如果是这样,图书馆提供这个?如果你有任何你知道的链接,那么他们会非常感谢。
在此先感谢
不幸的是,没有人回答这个问题,许多IOC容器包含注射控制特性的一些实现,但也没有办法,而不实际创建一个控制的(目前)一个无参数的构造函数。
是的,你可以,我建议你看看spring.net
http://www.springframework.net/doc-latest/reference/html/springair.html
我不知道,如果你想保持你所提出的建议的用户控件的想法。
就我个人而言,我一起使用spring.net和nHibernate(虽然避免了当前提供的Hibernate模板),它正在与.net MVC测试版一起工作。
使用Spring.net来处理nHibernate会略微减少配置条目,而MVC不会使用您需要的上下文xmls(springair就是一个很好的例子)。
好运
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)
{
}
}
不幸的是,我们在这个库中有很多用户控件,所以它不能直接移植到MVC中。并用构造函数注入用户控件不起作用,但我已经计算出我将相关信息/行为注入到字段中。 – 2009-01-05 16:28:01