Внедрение зависимости Castle Windsor от nHibernate ISession в WebForms - PullRequest
1 голос
/ 10 августа 2011

Мне было интересно, как подключить Castle Windsor в WebForms.

Я предполагаю, что вторая строка соединяет контроллеры в MVC:

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

Как мне подключить WebForms в ASP.NET?

У меня был проект, который я изменил в идентичную настройку WebForms. Все работает до того момента, когда я хочу, чтобы Castle Windsor внедрил ISession в страницу ASPX. Это просто не так, и я предполагаю, что вторая строка кода, приведенная выше, предназначена для контроллеров MVC.

У меня есть это в моем инсталляторе nHibernate, в одном и том же месте на обоих проектах:

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

Я изначально предполагал, что это сделает это, но это не так.

Я застрял на этом в течение нескольких дней, и с очень небольшим количеством официальной документации по этому я близок к тому, чтобы вырывать мои волосы, что от этого осталось.

Я знаю, что веб-формы ASP.NET специально не предназначены для работы с внедрением зависимости, но Ninject сделал это, хотя и с небольшим взломом, если я могу подтвердить, что Castle Windsor не совместим и / или не будет больше поддержки веб-форм я перейду к чему-то другому.

1 Ответ

0 голосов
/ 11 августа 2011

Мне удалось запихнуть Castle Windsor в WebForms, используя код здесь Как использовать Castle Windsor с веб-формами ASP.Net? Он использует атрибут, чтобы пометить, где должна быть введена зависимость вWebFrom.

Затем я использовал шаблон MVP.У каждой веб-формы был презентатор

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; }
    }
}

Поскольку ведущий разрешается из контейнера, он возвращается к нормальному состоянию для подключения зависимостей

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");
    }

}

Мое решение основано на статья Билли МакКафферти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...