Niranjan
Niranjan

Reputation: 2229

How to implement generics in C# interfaces?

Hi I am trying to implement Generics in C# interfaces. I have one method which should take different models as parameters after implementing Generics. Below is my Interface.

 public interface IKafkaProducer<T>
  {
    Task ProduceAsync(T kafkaEvent, string topicName);
  }

This Kafka event may should be different models after implementing Generics. For example It should be able to take Employee or User class etc. Below is my class implementation.

public class KafkaProducer<T> : IKafkaProducer<T>
  {
   public async Task ProduceAsync(T kafkaEvent, string topicName)
    {
      using (var schemaRegistry = new CachedSchemaRegistryClient(this.kafkaSchemaRegistryConfig.GetConfig()))
      using (var producer =
               new ProducerBuilder<string, ProductRangeEvent>(this.producerConfigFactory.ProducerConfig())
                   .SetKeySerializer(new AvroSerializer<string>(schemaRegistry))
                   .SetValueSerializer(new AvroSerializer<ProductRangeEvent>(schemaRegistry))
                   .Build())
      {
        Console.WriteLine($"{producer.Name} producing on {topicName}. Enter user names, q to exit.");
        await producer
              .ProduceAsync(topicName, new Message<string, ProductRangeEvent> { Key = null, Value = kafkaEvent })
              .ContinueWith(task => task.IsFaulted
                  ? $"error producing message: {task.Exception.Message}"
                  : $"produced to: {task.Result.TopicPartitionOffset}");
      }
    }
  }

In the above code, ProduceAsync(topicName, new Message<string, ProductRangeEvent> { Key = null, Value = kafkaEvent }) value = kafkaEvent is giving error. This kafkaEvent is of type ProductRangeEvent. It is giving me error cannot implicitly convert type T to ProductRangeEvent. I am calling above method as

public class TestController
  {
    private readonly IKafkaProducer kafkaProducer;

    public TestController(IKafkaProducer kafkaProducer)
    {
      this.kafkaProducer = kafkaProducer;
    }
     [HttpGet]
        [Route("/api/test")]
        public IActionResult Test()
        {
          ProductRangeEvent productRangeEvent = new ProductRangeEvent
          {
            id = "101"
          };
          var response = this.kafkaProducer.ProduceAsync(productRangeEvent, "users");
          response.Wait();
          var hi = response.IsCompletedSuccessfully;
          return null;
        }
      }

In the above code private readonly IKafkaProducer kafkaProducer; is also giving me error Using the generic type IKafkaProducer requires one argument. Can someone help me to fix this issue? Any help would be appreciated. Thanks

Upvotes: 2

Views: 212

Answers (1)

John Wu
John Wu

Reputation: 52290

Change this line:

private readonly IKafkaProducer kafkaProducer;

To

private readonly IKafkaProducer<ProductRangeEvent> kafkaProducer;

Upvotes: 2

Related Questions