Добавление изменяющегося представления списка двигателей

Я пытаюсь разработать многопользовательский проект, в котором у каждого клиента могут быть свои особые механизмы просмотра.

В частности, я хотел бы скомпилировать представления в DLL (используя RazorEngine) и иметь отдельное лицо RazorViewEngine для каждого клиента, но также обеспечивают запасной вариант к стандарту RazorViewEngine если не найдено подходящих представлений, как это делает инфраструктура MVC, если у вас задано несколько обработчиков представлений.

Я обнаружил, что могу ввести двигатели представления, используя autofac в Global.asax моего проекта MVC 4 с использованием:

ViewEngines.Engines.Clear();

var builder = new ContainerBuilder();
builder.RegisterType<WebFormViewEngine>().As<IViewEngine>();

Теперь я также хочу предоставить конкретные переопределения арендатора, как упомянуто выше, что я могу сделать с помощью следующего кода:

var mtc = new MultitenantContainer(tenantIdStrategy, builder.Build());
mtc.ConfigureTenant("Client1", b => b.RegisterType<RazorViewEngine>().As<IViewEngine>());
DependencyResolver.SetResolver(new AutofacDependencyResolver(mtc));

В этом примере кода я просто хотел посмотреть, смогу ли я установить WebFormsViewEngine как запасной вариант, а затем включить RazorViewEngine для конкретного арендатора.

После загрузки и просмотра URL-адреса, не принадлежащего арендатору, mvc разрешит только WebFormsViewEngine, как и ожидалось (путем вызова DependencyResolver и, в свою очередь, Autofac), это работает, как ожидалось, однако, когда я затем посещаю URL, который также будет включать RazorViewEngine никакие представления не найдены, даже если существует действительный вид бритвы.

И наоборот, если я остановлю IISExpress или сделаю что-нибудь, чтобы сгенерировать перезапуск пула приложений и сначала посетить URL-адрес, доступный для аренды, оба регистратора регистрируются.

Из того, что я могу сказать, MVC кэширует список механизмов просмотра, полученных после первого вызова MultiServiceResolver.

internal IViewEngine[] CombinedItems
{
    get
    {
        IViewEngine[] combinedItems = _combinedItems;
        if (combinedItems == null)
        {
            combinedItems = MultiServiceResolver.GetCombined<IViewEngine>(Items, _dependencyResolver);
            _combinedItems = combinedItems;
        }
        return combinedItems;
    }
}

Есть ли способ отменить это кэширование или другой лучший способ добиться того, что я пытаюсь получить здесь?

0 ответов

Другие вопросы по тегам