私はDIとAutofacに非常に慣れていません。以下にリストされているように、私はシングルトンクラスを持ってProducerService
います。これは、BackgroundService のコンストラクターで依存関係として使用されます。ProducerService には、コンストラクターによって注入された依存関係がIKafkaProducerAggregate
あります。これも以下に示します。
IKafkaProducerAggregate<TKey, Tvalue>
ProducerService<TKey, TValue> に挿入するために作成される単一のインスタンスを作成するにはどうすればよいですか? IProducer
これには、ファクトリ メソッドを介して、外部の Kafka 合流ドットネット ライブラリからののインスタンスが含まれますIProducer<TKey, TValue> producer = new ProducerBuilder<TKey, TValue>(Config.Producer).Build();
。IProducer
集計インスタンスを作成し、 Kafka 合流式のファクトリ メソッドを使用して初期化する Autofac で何らかのファクトリ メソッドを使用できますか?
これまでのところ、プロデューサー サービスを登録する Autofac モジュールがあり、ファクトリ メソッドに似たものを使用する方法を理解するのに苦労していますか??? ProducerService の作成時に IKafkaProducerAggregate を作成します。
Assembly serializers = typeof(ConsumerService).GetTypeInfo().Assembly;
builder.RegisterGeneric(typeof(ProducerService<,>))
.As(typeof(IKafkaProducer<,>))
.SingleInstance();
インターフェース: IKafkaProducerAggregate
public interface IKafkaProducerAggregate<TKey, TValue>
{
IProducer<TKey, TValue> Producer { get; }
Action<DeliveryReport<TKey, TValue>> DeliveryReportAction { get; }
}
クラス: ProducerService
namespace WebApp.Kafka
{
public class ProducerService<Key, Value> : IProducerService<Key, Value>, IDisposable
{
private bool Disposed { get; set; }
private IKafkaProducerAggregate<Key, Value> ProducerAggregate { get; }
private ILogger Logger { get; set; }
ProducerService(
IKafkaProducerAggregate<Key, Value> aggregate,
ILogger<ProducerService<Key, Value>> logger)
{
Logger = logger ?? throw new ArgumentNullException(nameof(logger));
ProducerAggregate = aggregate ?? throw new ArgumentNullException(nameof(aggregate));
Disposed = false;
Logger.LogInformation("ProducerService constructor called");
}
public void Produce(string topic, Key key, Value value)
{
ProducerAggregate.Producer.Produce(topic, new Message<Key, Value> { Key = key, Value = value }, ProducerAggregate.DeliveryReportAction);
Logger.LogInformation("Produce topic : {}, key : {}, value : {}", topic, key.ToString(), value.ToString());
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!Disposed)
{
if (disposing)
{
Logger.LogInformation("Disposing Kafka producer...");
ProducerAggregate.Producer.Dispose();
}
Disposed = true;
}
}
~ProducerService()
{
Dispose(false);
}
}
}