加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 依赖注入:在aspx页面中注入用户控件

发布时间:2020-12-16 06:56:40 所属栏目:asp.Net 来源:网络整理
导读:我需要构建一个’可自定义的’asp.net Web应用程序(不是asp.net mvc). 我正在考虑使用IoC容器将用户控件注入aspx页面. 有人试过吗? 简而言之,我认为这可以实现: 我使用Scott Guthrie的方法构建可重用的“用户控件库”(请参阅??他的文章“创建和使用用户控
我需要构建一个’可自定义的’asp.net Web应用程序(不是asp.net mvc).

我正在考虑使用IoC容器将用户控件注入aspx页面.

有人试过吗?

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

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

而已.

这基本上可以通过这里讨论的Spring.Net来完成,如此处讨论的那样,但注入用户控件.

有没有人对这些东西有一些经验?还是听起来很傻?备择方案 ?

我们的想法是可以在我的“用户控件库”之上构建不同的Web应用程序,而无需触及该库.

例如:在我的库中,我有一个包含4个文本框的页面,对于一个特定的应用程序,我需要添加一个文本框,而不更改页面的代码.我们的想法是在该页面中放置一个占位符,并在此占位符中动态注入我的自定义文本框.

解决方法

它与您的情况不完全相同,但我需要动态注入编辑器控件,具体取决于正在编辑的实体的运行时类型.我的所有控件都是从这样的通用接口继承而来的:

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容器(在这种情况下为StructureMap),我可以使用类似的东西获得正确的用户控件

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配置中的任何位置改变它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读