2012-03-01 93 views
3

我想补充引导NancyFX与RavenDB和我遇到了以下错误试图运行应用程序...自举NancyFX与RavenDB

“无法解析类型:Nancy.IResponseFormatter”

环境:

ASP.Net

南希

Nancy.Host ing.Aspnet

RavenDB

VS2010 DevelopmentServer

代替粘贴的所有代码的,这里是我作为例子的网站的链接。举例来说,我的意思是我逐字复制了它,看看我是否能够实现它的功能。 http://stuff-for-geeks.com/category/NancyFx.aspx

我已经看到过这段代码在演示之前运行过,但由于某种原因,我无法运行它。它在启动时失败。这几乎就像南希不使用我的BootStrapper。

更多的堆栈跟踪:

[TypeInitializationException:关于 'Nancy.Hosting.Aspnet.NancyHttpRequestHandler' 的类型初始引发异常] Nancy.Hosting.Aspnet.NancyHttpRequestHandler..ctor()+ 0

[TargetInvocationException:异常已被调用的目标抛出]

任何帮助,将真正理解。

回答

3

该代码基于旧版本的Nancy。你应该看看使用IResponseFormatterFactory来代替。在博客文章中定义的自定义模块构建器基于DefaultNancyModuleBuilder的旧副本,如果您查看当前版本https://github.com/NancyFx/Nancy/blob/master/src/Nancy/Routing/DefaultNancyModuleBuilder.cs,则应该可以进行必要的调整

+0

谢谢,就是这样。我有点不好意思,因为我没有注意到这一点。感谢您的帮助,并再次感谢。 – TheWeekendDeveloper 2012-03-01 15:55:27

2

以下是代码对于正在讨论的RavenAwareModuleBuilder类:

编辑1

下面的代码已经更新了南希版本0.12。请注意BuildModule方法中新增的NegotiationContext行。

public class RavenAwareModuleBuilder : INancyModuleBuilder 
{ 
    private readonly IViewFactory viewFactory; 
    private readonly IResponseFormatterFactory responseFormatterFactory; 
    private readonly IModelBinderLocator modelBinderLocator; 
    private readonly IModelValidatorLocator validatorLocator; 
    private readonly IRavenSessionProvider ravenSessionProvider; 

    public RavenAwareModuleBuilder(IViewFactory viewFactory, IResponseFormatterFactory responseFormatterFactory, IModelBinderLocator modelBinderLocator, IModelValidatorLocator validatorLocator, IRavenSessionProvider ravenSessionProvider) 
    { 
     this.viewFactory = viewFactory; 
     this.responseFormatterFactory = responseFormatterFactory; 
     this.modelBinderLocator = modelBinderLocator; 
     this.validatorLocator = validatorLocator; 
     this.ravenSessionProvider = ravenSessionProvider; 
    } 


    public NancyModule BuildModule(NancyModule module, NancyContext context) 
    {    
     context.NegotiationContext = new NegotiationContext 
     { 
      ModuleName = module.GetModuleName(), 
      ModulePath = module.ModulePath, 
     }; 

     module.Context = context; 
     module.Response = this.responseFormatterFactory.Create(context); 
     module.ViewFactory = this.viewFactory; 
     module.ModelBinderLocator = this.modelBinderLocator; 
     module.ValidatorLocator = this.validatorLocator; 

     context.Items.Add(
      "IDocumentSession", 
      ravenSessionProvider.GetSession() 
     ); 

     module.After.AddItemToStartOfPipeline(ctx => 
     { 
      var session = ctx.Items["IDocumentSession"] as IDocumentSession; 
      if (session != null) session.Dispose(); 
     }); 

     return module; 
    } 
}