我需要构建一个“可定制的”asp.net Web 应用程序(不是 asp.net mvc)。
我正在考虑使用 IoC 容器将用户控件注入(inject) aspx 页面。
有人试过吗?
简而言之,我认为这是可以实现的:
就是这样。
这基本上是 Spring.Net 可以做到的,正如这里所讨论的 http://blogger.forgottenskies.com/?p=70但是注入(inject)用户控件。
有人对这些东西有经验吗?还是听起来很傻?备择方案 ?
这个想法是有可能在我的“用户控件库”之上构建不同的 Web 应用程序,而无需触及该库。
例如:在我的库中,我有一个包含 4 个文本框的页面,对于一个特定的应用程序,我需要添加一个文本框,而无需更改页面的代码。想法是在该页面中放置一个占位符,并在该占位符中动态注入(inject)我的自定义文本框。
最佳答案
它与您的情况不完全相同,但我需要根据正在编辑的实体的运行时类型动态注入(inject)编辑器控件。我的所有控件都继承自这样的通用接口(interface):
public interface IEditor
{
bool CanHandle(EntityBase entity);
void Display(EntityBase entity);
void Save(EntityBase entity);
}
public partial class AddressEditor : UserControl, IEditor
{
public bool CanHandle(EntityBase entity)
{
return (entity is Address);
}
public void Display(EntityBase entity)
{
var address = (Address)entity;
addressLine1Textbox.Text = address.Line1;
// etc...
}
public void Save(EntityBase entity)
{
var address = (Address)entity;
address.Line1 = addressLine1Textbox.Text;
// etc...
}
}
然后使用 IoC 容器(在这种情况下为结构图)我可以通过类似的方式获得正确的用户控件
var editorControl = ObjectFactory.GetAllInstancesOf<IEditor>().First(x => x.CanHandle(myEntity));
但是,这就是它变得棘手的地方,如果您像这样创建它的实例,则无法将用户控件添加到页面。您需要知道它的 .ascx 文件的位置。您可以通过编辑器界面公开它,以便每个控件都返回它:
public string AscxFile { get { return "~/UserControls/AddressEditor.ascx"; } } // Implements IEditor.AscxFile
然后在调用页面,使用LoadControl:
var actualControl = LoadControl(editorControl.AscxFile);
editorPlaceholder.Controls.Add(actualControl);
editorControl.Display(myEntity);
我更喜欢使用复合控件,它们需要更多的精力来创建,但无需担心 .ascx 文件,我可以直接将其添加到页面中:
var editorControl = ObjectFactory.GetAllInstancesOf<IEditor>().First(x => x.CanHandle(myEntity));
editorPlaceholder.Controls.Add((Control)editorControl);
editorControl.Display(myEntity);
确保您在 Page.OnInit 阶段添加控件,以便它可以参与 ViewState,并且在回发之间不会被记住,因此您必须每次都这样做。
最后一步是使用您选择的 IoC 工具进行连接,我使用 StructureMap 自动加载
IEditor
的所有实例但我可以在应用程序代码或 xml 配置中的任何时候改变它。
关于asp.net - 依赖注入(inject) : injecting user control in aspx page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1768675/