Как реализовать дженерики в интерфейсах C #? - PullRequest
2 голосов
/ 27 июня 2019

Привет, я пытаюсь реализовать Generics в C # интерфейсах.У меня есть один метод, который должен принимать различные модели в качестве параметров после реализации Generics.Ниже приведен мой интерфейс.

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

Это событие Кафки может быть различными моделями после реализации Generics.Например, он должен иметь возможность принимать класс Employee или User и т. Д. Ниже приведена реализация моего класса.

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}");
      }
    }
  }

В приведенном выше коде ProduceAsync(topicName, new Message<string, ProductRangeEvent> { Key = null, Value = kafkaEvent }) value = kafkaEvent выдает ошибку.Этот kafkaEvent имеет тип ProductRangeEvent.Это дает мне ошибку, не может неявно преобразовать тип T в ProductRangeEvent.Я называю вышеуказанный метод как

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;
        }
      }

В приведенном выше коде приватный только для чтения IKafkaProducer kafkaProducer;также выдает ошибку Использование универсального типа IKafkaProducer требует одного аргумента.Может кто-нибудь помочь мне решить эту проблему?Любая помощь будет оценена.Спасибо

1 Ответ

2 голосов
/ 27 июня 2019

Изменить эту строку:

private readonly IKafkaProducer kafkaProducer;

Для

private readonly IKafkaProducer<ProductRangeEvent> kafkaProducer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...