Orchard ICustomVirtualPathProvider - PullRequest
       8

Orchard ICustomVirtualPathProvider

0 голосов
/ 15 октября 2018

Я пытаюсь зарегистрировать ICustomVirtualPathProvider в одном из моих модулей.Это то, что я пытаюсь использовать:

public class AzureVirtualPathProvider : VirtualPathProvider, ICustomVirtualPathProvider
{

    public IStaticDataStorageProvider StaticDataStorageProvider { get; set; }

    public VirtualPathProvider Instance
    {
        get
        {
            return this;
        }
    }

    public AzureVirtualPathProvider(IStaticDataStorageProvider staticDataStorageProvider)
    {
        StaticDataStorageProvider = staticDataStorageProvider;
    }

    public override bool FileExists(string virtualPath)
    {
        if (!virtualPath.Contains("StaticData")) return base.FileExists(virtualPath);
        return true;
    }

    public override VirtualFile GetFile(string virtualPath)
    {
        if (!virtualPath.Contains("StaticData") || !StaticDataStorageProvider.IsCloud()) return base.GetFile(virtualPath);
        return new CustomVirtualFile(StaticDataStorageProvider, virtualPath);
    }

}

, поэтому в Module.Load я устанавливаю:

 protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<AzureVirtualPathProvider>().PropertiesAutowired().As<ICustomVirtualPathProvider>();            
    }

, но это не было обнаружено, когда Orchard вызывает эту строку в OrchardStartup.cs (в Orchard.Framework)

        if (HostingEnvironment.IsHosted) {
            foreach (var vpp in container.Resolve<IEnumerable<ICustomVirtualPathProvider>>()) {
                HostingEnvironment.RegisterVirtualPathProvider(vpp.Instance);
            }
        }

Я пытался вызвать HostingEnvironment.RegisterVirtualPathProvider напрямую, таким образом:

HostingEnvironment.RegisterVirtualPathProvider(new AzureVirtualPathProvider());

и пытался внедрить зависимость, используя инъекцию свойства:

builder.Register(c => new AzureVirtualPathProvider { StaticDataStorageProvider = c.Resolve<IStaticDataStorageProvider>() });

однако значение для StaticDataStorageProvider всегда равно нулю при запуске AzureVirtualPathProvider.

Я пытался переместить AzureVirtualPathProvider в OrchardFramework, но затем он не разрешает StaticDataStorageProvider.

Как заставить Orchard загрузить мой CustomVirtualPathProvider?

1 Ответ

0 голосов
/ 26 октября 2018

В конце концов я сделал это:

public class OrchardShellEvents : IOrchardShellEvents
    {

        readonly ICustomVirtualPathProvider _customVirtualPathProvider;

        public OrchardShellEvents(ICustomVirtualPathProvider customVirtualPathProvider)
        {
                _customVirtualPathProvider = customVirtualPathProvider;
        }
        public void Activated()
        {
            HostingEnvironment.RegisterVirtualPathProvider(_customVirtualPathProvider.Instance);
        }

        public void Terminating()
        {

        }
    }

Я не знаю, является ли это лучшим решением, но оно сработало и могло бы помочь кому-то еще.

...