Разрешение зависимости конструктора от службы, используемой в NancyFX

У меня есть следующий бутстрап

public class NancyBootStrapper: DefaultNancyBootstrapper
{
    protected override void ConfigureRequestContainer(TinyIoC.TinyIoCContainer container, NancyContext context)
    {
        base.ConfigureRequestContainer(container, context);

        var ravenSession = container.Resolve< IRavenSessionProvider >().GetSession();
        container.Register( ravenSession );
    }
}

Когда мое приложение Нэнси пытается создать экземпляр BlogService, используя следующий конструктор

    public BlogService(IDocumentSession documentSession)
    {
        this.documentSession = documentSession;
    }

приложение взрывается, заявляя, что оно не может разрешить сеанс документа, я также пробовал следующее в своем тестовом методе (удаление инъекции конструктора).

    public void BuildCategories()
    {
        var container = TinyIoCContainer.Current;
        documentSession = container.Resolve< IDocumentSession >();
        documentSession.Store(new Category{Title = "test"});
        documentSession.Store(new Category{Title = ".net"});

        documentSession.SaveChanges();
    }

Это также взрывается, указывая на то, что он не может разрешить documentSession.

Это первый раз, когда я использовал NancyFX или TinyIoC, поэтому я мог делать что-то принципиально неправильное, хотя я должен упомянуть, что documentSession разрешается в модуле Nancy.

Может ли кто-нибудь предложить исправление или некоторые предложения?


person andycwk    schedule 04.09.2012    source источник


Ответы (2)


Когда должен быть создан экземпляр BlogService? -Я предполагаю, что это будет один раз для приложения, и в этом случае я считаю, что вы регистрируете сеанс в неправильном методе начальной загрузки и должны сделать это в ConfigureApplicationContainer.

person Christian Horsdal    schedule 04.09.2012
comment
Ага... сеанс следует шаблону единицы работы и требует один сеанс на запрос, поэтому я регистрируюсь в ConfigureRequestContainer. Но это не объясняет, почему я могу разрешить сеанс в методе buildCategiries во время выполнения. Я бы подумал, что текущая версия TonyIoC будет раскрывать конфигурацию запроса с помощью всего приложения :( - person andycwk; 04.09.2012

Я играл и копался в кодовых базах NancyFx и TinyIoC и выяснил, как решить эту проблему... Мне не нравится это исправление... но оно работает :)

По сути, я создаю сеанс документа RavenDB в методе начальной загрузки configureRequestContainer, поскольку рекомендуется использовать запрос в качестве единицы объема работы.

К сожалению, все, что автоматически связывается с помощью tinyIoC в configureApplicationContainer, не имеет какой-либо инъекции конструктора, выполненной с использованием дочернего контейнера, используемого запросом Нэнси (включая те, которые помечены как MultiInstance или как PerRequestSingleton.

Чтобы обойти это, вам необходимо перерегистрировать любые компоненты, которые зависят от ваших компонентов для каждого запроса в том же дочернем контейнере.

Как я уже сказал, мне не нравится исправление, но в конечном итоге это исправление :)

person andycwk    schedule 04.09.2012
comment
Контейнеры запросов создаются, настраиваются и уничтожаются для каждого запроса, поэтому да, они доступны только в этом запросе по дизайну. Если вы хотите использовать сеанс вне запроса nancy, вам придется либо (а) использовать другой сеанс, либо (б) привязать себя к хостингу ASP.Net и HttpContext и поместить его туда (тьфу!) .. лично Я бы выбрал (а), но это единственные варианты, которые я могу придумать. - person Steven Robbins; 05.09.2012