Castle Windsor将nHibernate ISession依赖注入WebForms

时间:2011-08-10 17:10:07

标签: nhibernate dependency-injection castle-windsor webforms

我想知道如何在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我会转向别的东西。

1 个答案:

答案 0 :(得分:0)

我设法使用此处的代码将Castle Windsor填入WebForms How to use Castle Windsor with ASP.Net web forms?它使用一个属性来标记应该在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