2016-03-30 6 views
2

Ich habe einen Selbst Hosting-Nancy-Instanz und der Inhalt in der Assembly eingebettet (einige sshtml Ansichten und ein paar CSS-Dateien)Embedded statische Inhalte in Selbst Hosting Nancy Instanz

Dies ist der Inhalt meiner DefaultNancyBootstrapper

public class CustomBootstrapper : DefaultNancyBootstrapper 
{ 
    private byte[] favicon; 

    protected override byte[] FavIcon 
    { 
     get { return this.favicon ?? (this.favicon = LoadFavIcon()); } 
    } 

    private byte[] LoadFavIcon() 
    { 
     using (var resourceStream = GetType().Assembly.GetManifestResourceStream("FrontEnd.Webinterface.Views.Content.Images.Icons.FavIcon.ico")) 
     { 
      var memoryStream = new MemoryStream(); 
      resourceStream.CopyTo(memoryStream); 
      return memoryStream.GetBuffer(); 
     } 
    } 

    protected override NancyInternalConfiguration InternalConfiguration 
    { 
     get 
     { 
      return NancyInternalConfiguration.WithOverrides(OnConfigurationBuilder); 
     } 
    } 

    void OnConfigurationBuilder(NancyInternalConfiguration x) 
    { 
     x.ViewLocationProvider = typeof(ResourceViewLocationProvider); 
    } 

    protected override void ConfigureApplicationContainer(TinyIoCContainer container) 
    { 
     Assembly assembly = Assembly.GetExecutingAssembly(); 
     string[] assemblyNames = assembly.GetManifestResourceNames(); 

     base.ConfigureApplicationContainer(container); 
     ResourceViewLocationProvider.RootNamespaces.Add(
      Assembly.GetAssembly(typeof(MainModule)), "FrontEnd.Webinterface.Views"); 
    } 

    protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines) 
    { 
     base.ApplicationStartup(container, pipelines); 
     CookieBasedSessions.Enable(pipelines); 
    } 

    protected override IEnumerable<ModuleRegistration> Modules 
    { 
     get 
     { 
      return 

       AppDomainAssemblyTypeScanner 
        .TypesOf<INancyModule>(ScanMode.All) 
        .NotOfType<DiagnosticModule>() 
        .Select(t => new ModuleRegistration(t)) 
        .ToArray(); 
     } 
    } 
} 

Ich bin völlig stecken, wie meine statischen CSS-Dateien einbetten - Kann mir jemand helfen?

EDIT:

Lösung ist ganz einfach, wenn dies in Ihrer Nancy Assembly ist https://github.com/NancyFx/Nancy/blob/master/src/Nancy.Embedded/Conventions/EmbeddedStaticContentConventionBuilder.cs

protected override void ConfigureConventions(NancyConventions nancyConventions) 
     { 
      Assembly Assembly = System.Reflection.Assembly.GetExecutingAssembly(); 

      nancyConventions.StaticContentsConventions.Add(EmbeddedStaticContentConventionBuilder.AddDirectory("Static", Assembly, @"Webinterface/Static")); 
      nancyConventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("Views", @"Webinterface/Views")); 
     } 
+0

* und eingebettet der Inhalt in der Montage * - bitte erklären? Diese statischen Dateien werden normalerweise nicht in Assemblys gebündelt. Können Sie Ihre Lösungsstruktur auch etwas näher erläutern? Danke –

+0

Ich habe eine Lösung, die ein paar Windows-Formulare und das Nancy-Webinterface als Self-Hosting-Instanz enthält. Ich möchte eine Lösung haben, die völlig out-of-the-box funktioniert, die alle *, DLL, Nancy Ansichten, Bilder, CSS in dieser eine .exe-Datei enthält, die ich verteilen werde. Also ja, ich bette auch diese statischen Dateien wie CSS und Bilder ein. – Tom

+0

Warum willst du das? Warum ist es wichtig, dass alles eine einzige EXE ist? –

Antwort

0

Auch wenn Sie bereits Ihre Frage selbst beantwortet würde Ich mag ein paar Zeilen hinzuzufügen, die in Bezug auf Lösung, die für mich gut funktionierte.

Vor allem hier sind einige Links mit der Diskussion über das Thema Erklärungen enthalten, wie die Dinge funktionieren:

Zweitens, anstelle von EmbeddedStaticContentConventionBuilder, dass Sie in Ihrer Frage erwähnt habe ich die Implementierung auf der Grundlage des Quellcodes aus dem zweiten Link von Patrick Steele, die viel einfacher ist:

public static class StaticResourceConventionBuilder 
{ 
    public static Func<NancyContext, string, Response> AddDirectory(string requestedPath, Assembly assembly, string namespacePrefix) 
    { 
     return (context, s) => 
     { 
      var path = context.Request.Path; 

      if (!path.StartsWith(requestedPath)) 
      { 
       return null; 
      } 

      string resourcePath; 
      string name; 

      var adjustedPath = path.Substring(requestedPath.Length + 1); 

      if (adjustedPath.IndexOf('/') >= 0) 
      { 
       name = Path.GetFileName(adjustedPath); 
       resourcePath = namespacePrefix + "." + adjustedPath 
        .Substring(0, adjustedPath.Length - name.Length - 1) 
        .Replace('/', '.'); 
      } 
      else 
      { 
       name = adjustedPath; 
       resourcePath = namespacePrefix; 
      } 

      return new EmbeddedFileResponse(assembly, resourcePath, name); 
     }; 
    } 
} 

Und dann

public class Bootstrapper : DefaultNancyBootstrapper 
{ 
    protected override void ConfigureConventions(NancyConventions nancyConventions) 
    { 
     base.ConfigureConventions(nancyConventions); 

     nancyConventions.StaticContentsConventions 
      .Add(StaticResourceConventionBuilder.AddDirectory("/Scripts", GetType().Assembly, "MyAssembly.Scripts")); 
    } 
} 
Verwandte Themen