gpt4 book ai didi

asp.net - 依赖注入(inject) : injecting user control in aspx page

转载 作者:行者123 更新时间:2023-12-04 19:23:33 24 4
gpt4 key购买 nike

我需要构建一个“可定制的”asp.net Web 应用程序(不是 asp.net mvc)。

我正在考虑使用 IoC 容器将用户控件注入(inject) aspx 页面。

有人试过吗?

简而言之,我认为这是可以实现的:

  • 我使用 Scott Guthrie 的方法来构建一个可重用的“用户控件库”(参见他的文章“创建和使用用户控件库”)。
  • 该库中的控件和页面应具有动态接收用户控件的位置(例如,在 asp PlaceHolder 中)。
  • 在构建于该库之上的自定义 Web 应用程序中,我创建了特定的用户控件。
  • 我以某种方式将它们放入 IoC 容器中,以便可以将它们注入(inject)到“用户控件库”的控件/页面中(例如,在 PlaceHolders 中)。

  • 就是这样。

    这基本上是 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com