繁体   English   中英

使用 Autofac C# 进行依赖注入 - 是否可以在注册泛型类型时指定工厂方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM