解决构造函数对NancyFX中使用的服务的依赖性

时间:2012-09-04 16:03:43

标签: ravendb nancy tinyioc

我有以下引导程序

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 个答案:

答案 0 :(得分:3)

BlogService什么时候应该被实例化? - 我猜应该是应用程序的一次,在这种情况下我相信你在错误的bootstrapper方法中注册会话,并且应该在ConfigureApplicationContainer中进行。

答案 1 :(得分:2)

我一直在玩&amp;深入研究NancyFx和TinyIoC代码库,并找出了解决这个问题的方法......我不喜欢修复...但干草有效:)

基本上,我在bootstrapper方法configureRequestContainer中创建RavenDB文档会话,因为最佳做法是将请求用作工作单元范围。

不幸的是,在configureApplicationContainer中由tinyIoC自动连接的任何内容都没有使用Nancy请求使用的子容器执行任何构造函数注入(这包括标记为MultiInstance或PerRequestSingleton的那些。

要解决此问题,您需要在同一子容器中重新注册依赖于每个请求组件的任何组件。

正如我所说,我不喜欢修复,但它最终是一个修复:)

相关问题