代码之家  ›  专栏  ›  技术社区  ›  johnstaveley

Orchard ICustomVirtualPathProvider

  •  0
  • johnstaveley  · 技术社区  · 6 年前

    我正在尝试在我的一个模块中注册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.RegisterVirtualPath Provider,因此:

    HostingEnvironment.RegisterVirtualPathProvider(new AzureVirtualPathProvider());
    

    并尝试使用property Injection注入依赖项:

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

    但是,在运行AzureVirtualPathProvider时,StaticDataStorageProvider的值始终为null。

    我尝试将AzureVirtualPathProvider移动到OrchardFramework,但它无法解析StaticDataStorageProvider。

    如何让Orchard加载我的CustomVirtualPathProvider?

    1 回复  |  直到 6 年前
        1
  •  0
  •   johnstaveley    6 年前

    最后我做到了:

    public class OrchardShellEvents : IOrchardShellEvents
        {
    
            readonly ICustomVirtualPathProvider _customVirtualPathProvider;
    
            public OrchardShellEvents(ICustomVirtualPathProvider customVirtualPathProvider)
            {
                    _customVirtualPathProvider = customVirtualPathProvider;
            }
            public void Activated()
            {
                HostingEnvironment.RegisterVirtualPathProvider(_customVirtualPathProvider.Instance);
            }
    
            public void Terminating()
            {
    
            }
        }
    

    我不知道这是否是最好的解决方案,但它奏效了,可能会帮助其他人。