[英]Dependency Injection With Autofac C# - Is It Possible To Specify A Factory Method When Registering A Generic Type
我對 DI 和 Autofac 很陌生。 我有一個單例類ProducerService
,如下所列。 這在 BackgroundService 的構造函數中用作依賴項。 ProducerService 有一個構造函數注入的依賴, IKafkaProducerAggregate
,也在下面列出。
如何創建IKafkaProducerAggregate<TKey, Tvalue>
的單個實例,該實例被創建以注入 ProducerService<TKey, TValue>? 這包含來自外部 Kafka IProducer
dotnet 庫的IProducer
實例,通過工廠方法IProducer<TKey, TValue> producer = new ProducerBuilder<TKey, TValue>(Config.Producer).Build();
. 我可以在 Autofac 中使用某種工廠方法來創建聚合實例並使用 Kafka IProducer
工廠方法初始化IProducer
嗎?
到目前為止,我有一個注冊生產者服務的 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);
}
}
}
您不需要任何工廠來在構造函數中創建依賴項的新實例,您只需使用 InstancePerDependency 生命周期范圍,而不是 SingleInstance。
https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.