Nancy, обслуживающий представления из модуля в отдельной библиотеке

#c# #asp.net #razor #nancy

#c# #asp.net #razor #nancy

Вопрос:

Я новичок в Nancy и пытаюсь настроить веб-приложение с каждым модулем / контроллером в отдельном проекте. Основной проект пуст ASP.NET проект и использует Nancy.Hosting.Aspnet пакет nuget.

Каков элегантный способ такой настройки?

Допустим, у меня есть следующая структура решения:

 /ModuleA
- ModuleA.csproj
- IndexA.cshtml (Copy to Output Directory = Copy Always)

/MainModule (references ModuleA)
- MainModule.csproj
- Index.cshtml
  

В настоящее время для обслуживания IndexA представления из ModuleA мне приходится писать View["bin/IndexA"] , что кажется довольно уродливым, потому что для этого также потребуется добавить префикс javascript / css таким же образом.

Комментарии:

1. Я не делал этого раньше, но попробуйте добавить в ResourceViewLocationProvider.RootNamespaces в вашем загрузчике. Что-то вроде ResourceViewLocationProvider.RootNamespaces.Add(typeof(ModuleA).Assembly, "ModuleA"); . Вы могли бы легко перебирать все модули, на которые ссылаются, и добавлять их во время выполнения. Не забудьте зарегистрировать поставщика ( NancyInternalConfiguration.ViewLocationProvider )

2. Спасибо, звучит многообещающе! Я попробую это, когда у меня будет возможность.

Ответ №1:

Вам необходимо настроить соглашения nancy в загрузчике. Вот документы nancy:https://github.com/NancyFx/Nancy/wiki/View-location-conventions .

Учитывая эту структуру решения:

 /ModuleA
- ModuleA.csproj
- views/IndexA.cshtml (Copy to Output Directory = Copy Always)
- assets/foo.js (Copy to Output Directory = Copy Always)

/MainModule (references ModuleA)
- MainModule.csproj
- Index.cshtml
  

В MainModule загрузчике:

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

        // for views in referenced projects
        nancyConventions.ViewLocationConventions.Add(
            (viewName, model, context) => string.Concat("bin/views/", viewName));

        // for assets in referenced projects         
        nancyConventions.StaticContentsConventions.Add(
            Nancy.Conventions.StaticContentConventionBuilder.AddDirectory("assets", "bin/assets"));
    }
}
  

В IndexA.cshtml :

 <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <script src="/assets/foo.js"></script>
    </head>
    <body></body>
</html>
  

Как упоминалось @eth0 в комментариях, вы также можете использовать сохранения представлений в качестве ресурсов, но это выходит за рамки моего ответа. Вот хорошая статья на эту тему:http://colinmackay.scot/2013/05/02/configuring-the-nancy-to-use-views-in-a-separate-assembly /