Руководство по составному веб-клиенту - PullRequest
6 голосов
/ 03 апреля 2012

Добрый день,

Мне было интересно, не могли бы вы помочь мне,

Я читал руководство, связанное со следующим: Составное веб-руководство

Я читал раздел «Определение структуры решения для модульного веб-приложения», в частности раздел «Множественные проекты». Кажется, я понимаю основные концепции, связанные с этим, однако я не могу найти разумный способ, позволяющий этому работать с моими веб-формами в отдельных проектах .

Я понимаю, что поддержка времени разработки для мастер-страниц здесь не будет поддерживаться, однако мой вопрос заключается в том, как использовать что-то вроде Unity (или другого контейнера), чтобы позволить мне развертывать свои проекты (которые включают страницы веб-форм и код за файлами) как полностью независимые от папки и подключающие их к решению, руководство кажется немного неясным относительно того, как поддерживать это, и всякий раз, когда я пытаюсь импортировать эти модули, я получаю ошибки времени выполнения. Я успешно работал с MVC, экспортируя контроллеры. Я был бы признателен за вашу поддержку, однако я понимаю, что вы очень занятые люди. Если бы вы могли связать меня с блогом или ресурсом, подробно объясняющим это, я был бы очень рад. Спасибо, что нашли время, чтобы прочитать это. Подводя итог, я хочу добиться следующего.

  1. Создание проекта моей веб-оболочки с использованием веб-форм asp.net (без silverlight или любой клиентской технологии)
  2. Создайте мои модули, которые существуют внутри их собственных проектов, которые содержат мои страницы aspx и aspx, а также любые зависимые сборки
  3. Я хочу, чтобы эти страницы были экспортируемыми и импортируемыми моей оболочкой.
  4. Если возможно, я бы хотел, чтобы мои сборки модулей находились в своих собственных папках, чтобы не испачкать мое решение.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2012

Некоторое время назад я делал нечто подобное в отношении системы типа плагинов, где плагины, где страницы и элементы управления, но хранились в отдельных сборках.

То, что мы в конечном итоге сделали, было:

Зарегистрируйте пользовательский VirtualPathProvider в Application_Start:

void Application_Start(object sender, EventArgs e)
{
    System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(
        new YourCustomVirtualPathProvider());
}

Переопределите необходимые методы в VirtualPathProvider (в зависимости от вашей логики):

public class YourCustomVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
{
    private const string RESERVED_PATH = "/components/external";
    public override bool FileExists(string virtualPath)
    {
        if (virtualPath.StartsWith(RESERVED_PATH))
            return true;
        else
            return base.FileExists(virtualPath);
    }

    public override VirtualFile GetFile(string virtualPath)
    {
        if (virtualPath.StartsWith(RESERVED_PATH))
            return new MyCustomVirtualFile(virtualPath);
        else
            return base.GetFile(virtualPath);
    }

    //You'll also need to override methods for directories, omitted for brevity.
}

Теперь создайте класс MyCustomVirtualFile для загрузки файлов из сборки:

public class MyCustomVirtualFile : System.Web.Hosting.VirtualFile
{
    private string _virtualPath;
    public MyCustomVirtualFile(string virtualPath) { _virtualPath = virtualPath }

    public override System.IO.Stream Open()
    {
        //You'll need some method to tie a virtual path to an assembly
        //Then load the file from the assembly and return as a Stream
        Assembly assembly = Foo.GetAssemblyByVirtualPath(_virtualPath);
        string fileName = Foo.GetFileNameFromVirtualPath(_virtualPath);
        return assembly.GetManifestresourceStream(fileName);
    }
}

ASPX / ASCX или файлы ресурсов, которые вы хотите загрузить таким образом, должны быть добавлены в сборку как встроенный ресурс. Вы можете сделать это, изменив свойство «Build Action» файла:

properties dialogue

Кодовый код будет скомпилирован в сборку, и если вы используете общую папку bin, вам не нужно больше ничего делать. Если они не будут переданы, вам нужно будет присоединиться к событиям AssemblyResolve и TypeResolve в глобальном приложении (подробнее об этом здесь ).

В конечном итоге мы отказались от этой идеи из-за проблем безопасности и в итоге заключили MEF контракты на данные, но если все остальные ваши сборки являются первыми, то это должно быть быстро и легко. Надеюсь, это поможет.

0 голосов
/ 07 апреля 2012

Взгляните на DotNetNuke . Общественная версия вполне способна и бесплатна.

1). Это решение C # с открытым исходным кодом без Silverlight. Он использует javascript для клиентской части (но я не думаю, что ваше требование должно исключать javascript)

2). В основе Dotnetnuke лежит инфраструктура, которая позволяет разработчику создавать модули (есть стартовые проекты), которые подключаются прямо к нему. Как разработчик, вы должны создать модуль в отдельном проекте, упаковать его и развернуть при необходимости.
Уже доступно множество сторонних модулей.

3). В платформу уже встроен веб-интерфейс для экспорта и импорта модулей.

4). Когда модуль установлен, он автоматически помещается в свои собственные папки.

...