如何使用Castle Windsor与ASP.Net Web表单?
发布时间:2020-05-23 04:39:15 所属栏目: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 MVC使用相同的控制器分离移动视图
- asp.net:部分类和继承
- asp.net – Elmah错误日志记录,我可以只记录一条消息吗?
- 如何在asp.net用户控件中使用jQuery ajax?
- asp.net – 使用AJAX进行WCF调用
- asp.net-mvc – 强大的html帮助程序,具有不同的get和post模
- ASP.NET MVC中的自定义文件夹结构5
- asp.net-mvc – ASP.NET MVC2 – 自定义模型绑定器示例
- asp.net – 在AJAX方法调用中的RegisterClientScriptBlock
- 这个ASP.NET顾问知道他在做什么?
推荐文章
站长推荐
- asp.net – 如何使用MVC 4和View Models(强类型)
- 在ASP.NET中构建动态“高级搜索”控件的建议
- asp.net – 如何从我的网站项目中删除未使用的CS
- asp.net – HttpContext.Current不解析在MVC 4项
- asp.net-mvc – 使用ASP.NET MVC的基础认证
- asp.net – WCF vs ASPX webmethods vs ASMX web
- asp.net – 无法获取项目引用的依赖项
- asp.net – 任何有关绘图组件/库的经验
- asp.net-mvc – 是否可以手动更新ModelState.IsV
- entity-framework – 将DbContext注入FluentVali
热点阅读
