如何使用Castle Windsor与ASP.Net Web表单?
发布时间:2020-12-15 19:28:05 所属栏目:asp.Net 来源:网络整理
导读:我试图将依赖注入与Windsor连接到标准的asp.net web表单。我想我已经实现了使用HttpModule和CustomAttribute(代码如下所示),虽然解决方案似乎有点笨重,并想知道是否有一个更好的支持解决方案开箱即用Windsor? 这里有几个文件一起显示在一起 // index.aspx
我试图将依赖注入与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<ILogger,Logger>(); } public IWindsorContainer Container { get { return _container; } } } public interface IoCProvider { IWindsorContainer Container { get; } } 解决方法
我想你基本上是在正确的轨道 – 如果你还没有建议看看Rhino Igloo,WebForms MVC框架,
Here’s a good blog post on this和来源是
here – Ayende(犀牛Igloo的作者)解决了问题在这个项目/库中使用Windsor与webforms相当好。
我将缓存反射信息,如果你要注入整个嵌套的控件,这可能最终是一个性能猪我怀疑。 最后,spring.net以更加面向配置的方式接近这一点,但是它可能值得看看它们的实现 – 这是一个很好的reference blog post。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 何时使用ASP.NET MVC与ASP.NET Web窗体?
- asp.net-mvc – 如何测试ASP.NET MVC 3中的RenderSection中
- asp.net-mvc – 使用AWS .NET SDK进行SNS订阅确认示例
- asp.net-mvc – ASP.NET MVC SiteMap提供程序 – 如何在实际
- C#_.NetFramework_Web项目_EXCEL数据导出 C#_.N
- asp.net – 双回发问题
- asp.net – 如何让我的转发器的Itemcommand事件不进行整页回
- 动手造轮子:实现简单的 EventQueue
- asp.net-mvc – 在AppHarbor上获取文件内容
- asp.net – 是否有更好的方法来访问ITemplate中的控件而不是
推荐文章
站长推荐
- asp.net-mvc-3 – 带有Npgsql和Entity Framework
- asp.net – 什么时候调用Application_End,我该如
- asp.net-mvc – MVC 4. IIS 7.5 PUT返回405
- asp.net-web-api – 如何在Azure Service Fabric
- asp.net-mvc – ASP.NET MVC:如何强制所有链接转
- asp.net – 人们如何调用aspx文件以区别于aspx.c
- asp.net-mvc – AspNet Identity 2.0电子邮件和用
- 认证 – WebApi ActionFilterAttribute,HttpActi
- ASP.NET MVC中的Dropdownlist onchange事件不使用
- 使用ASP.NET(C#)在不使用QueryString的情况下将变
热点阅读