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