I'm working on Worker Service in .Net Core
and Added DDD to it. In the Application Layer, I have created a Factory Pattern to Pick a specific Message Handler to handle different Kafka Topics. This approach is working fine. But, wanted to know is it the right way of implementing it? I am a bit confused about injecting constructor parameters in MessageFactory
public interface IMessageFactory
{
IMessageHandler CreateMessage(string topicName);
}
Implementation of Factory Method
public class MessageFactory: IMessageFactory
{
private readonly ILogger<MessageFactory> _logger;
private readonly IOneRepository _oneRepository;
private readonly ITwoRepository _twoRepositoty;
public MessageFactory(ILogger<MessageFactory> logger,
IOneRepository oneRepository,
ITwoRepository twoRepositoty)
{
_logger = logger;
_oneRepository = oneRepository;
_twoRepositoty = twoRepositoty;
}
public IMessageHandler CreateMessage(string topicName)
{
switch (topicName.ToUpper())
{
case KafkaConstants.OneMaster:
return new OneMessageHandler(_logger, _oneRepository );
case KafkaConstants.TwoMaster:
return new TwoMessageHandler(_logger, _twoRepositoty );
default:
return null;
}
}
}
}
Individual Handlers
public class OneMessageHandler : IMessageHandler
{
private readonly ILogger<MessageFactory> _logger;
private readonly IOneRepository _oneRepository;
public OneMessageHandler (ILogger<MessageFactory> logger,
IOneRepository _oneRepository)
{
_logger = logger;
_oneRepository = oneRepository;
}
public async Task<bool> ProcessMessage(string message)
{
..........
}
}
public class TwoMessageHandler : IMessageHandler
{
private readonly ILogger<MessageFactory> _logger;
private readonly ITwoRepository _twoRepository;
public TwoMessageHandler(ILogger<MessageFactory> logger,
ITwoRepository twoRepository)
{
_logger = logger;
_twoRepository = twoRepository;
}
public async Task<bool> ProcessMessage(string message)
{
..........
}
}
Worker Service
public class Worker: BackgroundService
{
private readonly IMessageFactory _messageFactory;
public Worker(IMessageFactory messageFactory)
{
_messageFactory = messageFactory;
}
IMessageHandler messageHandler = _messageFactory.CreateMessage("OneMaster");
messageHandler.ProcessMessage(message_from_kafka_response));
}
Dependency Injection
services.AddTransient<IMessageFactory, MessageFactory>();