【问题标题】:Castle Windsor dependancy injection of nHibernate ISession into WebFormsCastle Windsor 将 nHibernate ISession 依赖注入到 WebForms
【发布时间】:2011-08-10 17:10:06
【问题描述】:

我想知道如何在 WebForms 中连接 Castle Windsor。

我假设第二行连接了 MVC 中的控制器:

// Initialize Windsor
IWindsorContainer container = new WindsorContainer().Install(FromAssembly.This());
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container.Kernel));

然后如何在 ASP.NET 中连接 WebForms?

我有一个项目已修改为相同的 WebForms 设置。一切正常,直到我希望 Castle Windsor 将 ISession 注入 ASPX 页面。它根本没有,我假设上面的第二行代码是用于 MVC 控制器的。

我的 nHibernate 安装程序中有这个,在两个项目的同一个地方:

container.Register(Component.For<ISession>()
            .LifeStyle.PerWebRequest
            .UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession()));

我原本以为这样可以,但事实并非如此。

我已经坚持了好几天了,而且官方文档很少,我差点把头发扯掉,剩下什么。

我确实知道 ASP.NET WebForms 不是专门为使用依赖注入而设计的,但 Ninject 已经做到了,尽管有一点黑客攻击,如果我可以确认 Castle Windsor 不兼容和/或不会不再支持 WebForms 我将转向别的东西。

【问题讨论】:

    标签: nhibernate dependency-injection castle-windsor webforms


    【解决方案1】:

    我设法使用 How to use Castle Windsor with ASP.Net web forms? 此处的代码将 Castle Windsor 填充到 WebForms 中,它使用一个属性来标记应在 WebFrom 中注入依赖项的位置。

    然后我使用了 MVP 模式。每个 WebForm 都有一个演示者

    public partial class TestPage : UserControl, IShowTestPage
    {
        [Inject]
        public TestPagePresenter Presenter { get; set; }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;
    
            this.Presenter.OnViewInitialized();
        }
    
        public string TestMessage
        {
            get { return litTestMessage.Text; }
            set { litTestMessage.Text = value; }
        }
    }
    

    当 Presenter 从容器中解析出来后,它就会恢复正常以连接依赖项

    public interface IShowTestPage {
        string TestMessage { get; set;}
    }
    
    public class TestPagePresenter {
        private ISession session;
    
        public TestPagePresenter(ISession session) {
            this.session = session;
        }
    
        private IShowTestPage view;
        public IShowTestPage { set { view = value; } }  
    
        public void OnViewInitialized {
            TestMessage = session.Query("some database query");
        }
    
    }
    

    我的解决方案基于 Billy McCafferty 的出色 article

    【讨论】:

    • 谢谢,正是我想要的。虽然我已经回到基础并撕掉了城堡。如果我再次需要它,我知道去哪里找。
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多