0

我需要找到一种方法来获取 DataProcessingEngine 的实例而不调用它的构造器。我正在尝试使用组合对象中注册的 DataProcessingEngine 找到一种方法(请参阅以下代码)。但我找不到这样做的方法。有人有建议吗?提前致谢。

public class Composer : IUserComposer
{
    public void Compose(Composition composition)
    {
        composition.Register<IDataProcessingEngine, DataProcessingEngine>(Lifetime.Singleton);
        //DataProcessingEngine dataProcessing = compostion.Resolve<IDataProcessingEngine>()??//no resolve function exists in Umbraco.Core.Composing
        SaveImagesThread(dataProcessingEngine);
    }

    public Task SaveImagesThread(IDataProcessingEngine dataProcessingEngine)//TODO - decide async
    {
        string dataTimerTime = WebConfig.SaveProductsDataTimer;

        double time = GetTimeForTimer(dataTimerTime);
        if (time > 0)
        {
            var aTimer = new System.Timers.Timer(time); 
            aTimer.Elapsed += new ElapsedEventHandler(dataProcessingEngine.SaveImages);
            aTimer.Start();
        }
        return default;
    }
}
4

1 回答 1

0

对于所有正在寻找从作曲家(应用程序启动的地方)调用函数(在代码中的另一个类中定义的函数,引擎或...)并希望避免调用此函数的类的构造函数的所有人. 我找到了另一种方法:

public class QueuePollingHandler
    {
        [RuntimeLevel(MinLevel = RuntimeLevel.Run)]
        public class SubscribeToQueuePollingHandlerComponentComposer : 
        ComponentComposer<SubscribeToQueuePollingHandler>
        { }
        public class SubscribeToQueuePollingHandler : IComponent
        {
            private readonly IDataProcessingEngine _dataProcessingEngine;

            public SubscribeToQueuePollingHandler(IDataProcessingEngine 
            dataProcessingEngine)
            {
                _dataProcessingEngine = dataProcessingEngine;
                SaveImagesThread(_dataProcessingEngine);
            }

            public void SaveImagesThread(IDataProcessingEngine 
            dataProcessingEngine)
            {
             ....
            }
   }

逻辑解释:您创建一个类(示例中的 SubscribeToQueuePollingHandlerComponentComposer)并将其基类定义为 ComponentComposer<Class_that_inherits_IComponent>。当您启动应用程序时,您会看到它到达了已注册类的构造函数(SubscribeToQueuePollingHandler 构造函数)。

这就是我发现能够在应用程序启动时直接调用函数的方式,而无需调用其类构造函数并且实际上使用依赖注入。

于 2020-09-24T10:04:05.477 回答