Добавление изменяющегося представления списка двигателей
Я пытаюсь разработать многопользовательский проект, в котором у каждого клиента могут быть свои особые механизмы просмотра.
В частности, я хотел бы скомпилировать представления в 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;
}
}
Есть ли способ отменить это кэширование или другой лучший способ добиться того, что я пытаюсь получить здесь?