I am using Autofac, but ran into the same problem.
IEventProcessorFactory EventProcessorHost.
, EventProcessorHost :
public class EventHubProcessorHost
{
private readonly IEventProcessorFactory _eventProcessorFactory;
private readonly string _serviceBusConnectionString;
private readonly string _storageConnectionString;
private readonly string _eventHubName;
public EventHubProcessorHost(IEventProcessorFactory eventProcessorFactory, string serviceBusConnectionString, string storageConnectionString, string eventHubName)
{
_eventProcessorFactory = eventProcessorFactory;
_serviceBusConnectionString = serviceBusConnectionString;
_storageConnectionString = storageConnectionString;
_eventHubName = eventHubName;
}
public void Start()
{
var builder = new ServiceBusConnectionStringBuilder(_serviceBusConnectionString)
{
TransportType = TransportType.Amqp
};
var client = EventHubClient.CreateFromConnectionString(builder.ToString(), _eventHubName);
try
{
var eventProcessorHost = new EventProcessorHost("singleworker",
client.Path, client.GetDefaultConsumerGroup().GroupName, builder.ToString(), _storageConnectionString);
eventProcessorHost.RegisterEventProcessorFactoryAsync(_eventProcessorFactory);
}
catch (Exception exp)
{
Console.WriteLine("Error on send: " + exp.Message);
}
}
}
factory, , IoC:
public class MyEventProcessorFactory : IEventProcessorFactory
{
private readonly IComponentContext _componentContext;
public MyEventProcessorFactory(IComponentContext componentContext)
{
_componentContext = componentContext;
}
public IEventProcessor CreateEventProcessor(PartitionContext context)
{
return _componentContext.Resolve<IEventProcessor>();
}
}
EventProcessor:
public class MyEventProcessor : IEventProcessor
{
private IFoo _foo;
public MyEventProcessor(IFoo foo)
{
_foo = foo;
}
public Task OpenAsync(PartitionContext context)
{
return Task.FromResult<object>(null);
}
public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> events)
{
foreach (var eventData in events)
{
}
await context.CheckpointAsync();
}
public async Task CloseAsync(PartitionContext context, CloseReason reason)
{
if (reason == CloseReason.Shutdown)
{
await context.CheckpointAsync();
}
}
}
Autofac :
builder.RegisterType<Foo>().As<IFoo>()
builder.RegisterType<MyEventProcessor>().As<IEventProcessor>()
builder.Register(c => new MyEventProcessorFactory(c.Resolve<IComponentContext>())).As<IEventProcessorFactory>();
, .