当前位置:  开发笔记 > 后端 > 正文

如何使用Castle Windsor和ASP.Net网页表单?

如何解决《如何使用CastleWindsor和ASP.Net网页表单?》经验,为你挑选了1个好方法。

我正在尝试将依赖注入与Windsor连接到标准的asp.net Web表单.我认为我已经使用HttpModule和CustomAttribute(下面显示的代码)实现了这一点,虽然解决方案似乎有点笨拙,并且想知道是否有更好的支持解决方案开箱即用Windsor?

这里有几个文件一起显示

    // index.aspx.cs
    public partial class IndexPage : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Logger.Write("page loading");
        }

        [Inject]
        public ILogger Logger { get; set; }
    }

    // WindsorHttpModule.cs
    public class WindsorHttpModule : IHttpModule
    {
        private HttpApplication _application;
        private IoCProvider _iocProvider;

        public void Init(HttpApplication context)
        {
            _application = context;
            _iocProvider = context as IoCProvider;

            if(_iocProvider == null)
            {
                throw new InvalidOperationException("Application must implement IoCProvider");
            }

            _application.PreRequestHandlerExecute += InitiateWindsor;
        }

        private void InitiateWindsor(object sender, System.EventArgs e)
        {
            Page currentPage = _application.Context.CurrentHandler as Page;
            if(currentPage != null)
            {
                InjectPropertiesOn(currentPage);
                currentPage.InitComplete += delegate { InjectUserControls(currentPage); };
            }
        }

        private void InjectUserControls(Control parent)
        {
            if(parent.Controls != null)
            {
                foreach (Control control in parent.Controls)
                {
                    if(control is UserControl)
                    {
                        InjectPropertiesOn(control);
                    }
                    InjectUserControls(control);
                }
            }
        }

        private void InjectPropertiesOn(object currentPage)
        {
            PropertyInfo[] properties = currentPage.GetType().GetProperties();
            foreach(PropertyInfo property in properties)
            {
                object[] attributes = property.GetCustomAttributes(typeof (InjectAttribute), false);
                if(attributes != null && attributes.Length > 0)
                {
                    object valueToInject = _iocProvider.Container.Resolve(property.PropertyType);
                    property.SetValue(currentPage, valueToInject, null);
                }
            }
        }
    }

    // Global.asax.cs
    public class Global : System.Web.HttpApplication, IoCProvider
    {
        private IWindsorContainer _container;

        public override void Init()
        {
            base.Init();

            InitializeIoC();
        }

        private void InitializeIoC()
        {
            _container = new WindsorContainer();
            _container.AddComponent();
        }

        public IWindsorContainer Container
        {
            get { return _container; }
        }
    }

    public interface IoCProvider
    {
        IWindsorContainer Container { get; }
    }

Bittercoder.. 16

我认为你基本上是在正确的轨道上 - 如果你还没有我建议你去看看一个WebForms MVC框架Rhino Igloo,这里有一个很好的博客文章,来源就在这里 --Ayende(Rhino的作者) Igloo)解决了在这个项目/库中使用Windsor和webforms的问题.

如果你要注入整个嵌套的控件集,我会缓存反射信息,这可能最终成为我怀疑的一点性能.

最后,spring.net以更加面向配置的方式处理这个问题,但是可能值得看一下它们的实现 - 这里有一篇很好的参考博客文章.



1> Bittercoder..:

我认为你基本上是在正确的轨道上 - 如果你还没有我建议你去看看一个WebForms MVC框架Rhino Igloo,这里有一个很好的博客文章,来源就在这里 --Ayende(Rhino的作者) Igloo)解决了在这个项目/库中使用Windsor和webforms的问题.

如果你要注入整个嵌套的控件集,我会缓存反射信息,这可能最终成为我怀疑的一点性能.

最后,spring.net以更加面向配置的方式处理这个问题,但是可能值得看一下它们的实现 - 这里有一篇很好的参考博客文章.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有