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

标签 asp.net dependency-injection

我需要构建一个“可定制的”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/

    相关文章:

    dependency-injection - 具有开放通用接口(interface)的温莎类型工厂

    c# - MVVM 光 ViewModelLocator : How to register Singleton ViewModel?

    asp.net - 使用 RestSharp/JSON.NET 反序列化自定义数组

    c# - 多文件删除方法单元测试成功

    asp.net - Azure Application Insights 不显示数据

    c# - 发布后 Web.Config 文件加密不起作用

    java - 没有xml配置的spring是不扫描包的

    spring - JBoss 6 + Spring 3.0.5 + JAX-WS/CXF

    javascript - ASP.NET angularjs 重定向到 Controller 的另一个 View

    c# - 将html内容保存到数据库