Разрешение зависимости конструктора от службы, используемой в 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 );
    }
}

Когда мое приложение Nancy пытается создать экземпляр 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.

Кто-нибудь может предложить исправить или несколько предложений?

2 ответа

Решение

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

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

К сожалению, все, что автоматически связано с tinyIoC в configureApplicationContainer, не имеет никаких вложений конструктора, выполняемых с использованием дочернего контейнера, используемого запросом Nancy (включая те, которые помечены как MultiInstance или PerRequestSingleton.

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

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

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

Другие вопросы по тегам