Как передать параметры в реализацию IEventProcessor

Я занят реализацией EventProcessorHost клиент для лазурного клиента EventBus.

У меня есть класс, который реализует IEventProcessor следующее:

 public class MyEventProcessor : IEventProcessor
    {
        Stopwatch checkpointStopWatch;            

        //TODO: get provider id from parent class     


        public async Task CloseAsync(PartitionContext context, CloseReason reason)
        {
            Debug.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason);
            if (reason == CloseReason.Shutdown)
            {
                await context.CheckpointAsync();
            }
        }

        public Task OpenAsync(PartitionContext context)
        {
            Debug.WriteLine("SimpleEventProcessor initialized.  Partition: '{0}', Offset: '{1}'", context.Lease.PartitionId, context.Lease.Offset);
            eventHandler = new MyEventHandler();
            this.checkpointStopWatch = new Stopwatch();
            this.checkpointStopWatch.Start();
            return Task.FromResult<object>(null);
        }

        async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
        {
            foreach (EventData eventData in messages)
            {
                string data = Encoding.UTF8.GetString(eventData.GetBytes());              
                Debug.WriteLine(data);       
            }
            //Call checkpoint every 5 minutes, so that worker can resume processing from the 5 minutes back if it restarts.
            if (this.checkpointStopWatch.Elapsed > TimeSpan.FromMinutes(5))
            {
                await context.CheckpointAsync();
                this.checkpointStopWatch.Restart();
            }
        }
    }

Затем я называю это следующим образом:

 EventProcessorHost _eventProcessorHost = new EventProcessorHost(eventProcessorHostName, EndpointName, EventHubConsumerGroup.DefaultGroupName, ConnectionString, storageConnectionString, "messages-events");
 await _eventProcessorHost.RegisterEventProcessorAsync<MyEventProcessor>();

Мне нужно передать параметр к экземпляру MyEventProcessor который EventProcessorHost создает. Как бы я поступил так?

2 ответа

Вам просто нужно использовать RegisterEventProcessorFactoryAsync, чтобы передать экземпляр фабрики. Этот класс фабрики может передавать любые параметры, подходящие для метода фабрики, возможно, в первую очередь передавая их фабрике или изменяя поведение фабрики. В приведенном ниже коде вы видите два параметра, передаваемых в IEventProcessor. Один из них из параметров фабрики, а другой - счетчик того, сколько раз фабрика была вызвана.

class AzureStreamProcessor : IEventProcessor
{
     ....
}

class AzureStreamProcessorFactory : IEventProcessorFactory
{
    public AzureStreamProcessorFactory(string str)
    {
         this.randomString = str;
    }

    private string randomString;
    private int numCreated = 0;
    IEventProcessor IEventProcessorFactory.CreateEventProcessor(PartitionContext context)
    {
        return new AzureStreamProcessor(context, randomString, Interlocked.Increment(ref numCreated));
    }
}

host.RegisterEventProcessorFactoryAsync(new AzureStreamProcessorFactory("a parameter"), options);

Может быть, попробуйте выполнить инжекцию зависимости конструктора в класс MyEventProcessor с параметром, как показано ниже.

     public class MyEventProcessor : IEventProcessor
    {
        Stopwatch checkpointStopWatch;            

        //TODO: get provider id from parent class     
    IParameters _parameter;
    public MyEventProcessor (IParameters param)
    {
      this._parameter  = param;
     }

        public async Task CloseAsync(PartitionContext context, CloseReason reason)
        {
            Debug.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason);
            if (reason == CloseReason.Shutdown)
            {
                await context.CheckpointAsync();
            }
        }.....

Используйте _parameter, чтобы получить то, что вам нужно.

ниже показано, как вы можете зарегистрировать зависимости для ваших IParameters

Здесь я использую решатель зависимостей Ninject.

//Bind the class that implements IParameter.
 var parameters = new Parameter();
paramters.Property = "my data"

 kernel.Bind<IParameters>().ToConstant(parameters);

надеюсь, это поможет

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