How to infer the type when using generic repository .NET 5

192 Views Asked by At

I am working on a project in .Net 5. I have a generic Repository class that implements the IRepository interface.

public interface IRepository<T> where T:class
{
    Task<IEnumerable<T>> GetAllAsync(string url);
}

public class Repository<T>:IRepository<T> where T:class
{
    private readonly IHttpClientFactory _httpClientFactory;

    public Repository(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public async Task<IEnumerable<T>> GetAllAsync(string url)
    {
        var request = new HttpRequestMessage(HttpMethod.Get, url);
        var client = _httpClientFactory.CreateClient();
        var response = await client.SendAsync(request);
        if (response.StatusCode == HttpStatusCode.OK)
        {
            var jsonString = await response.Content.ReadAsStringAsync();
            return JsonSerializer.Deserialize<IEnumerable<T>>(jsonString);
        }
        return null;
    }
}

Also, I have a MyClass Object that implements the IMyClass interface:

public interface IMyClassRepository:IRepository<MyClass>
{
    
}

public class MyClassRepository:Repository<MyClassRepository>, IMyClassRepository
{
    public MyClassRepository(IHttpClientFactory httpClientFactory) : base(httpClientFactory)
    {

    }
}

In Startup.cs, I have registered dependencies as I did in my previous projects.

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IMyClassRepository, MyClassRepository>();
    services.AddControllersWithViews();
    services.AddHttpClient();
}

In the controller, I inject the IMyClassRepository. When I call the GetAllAsync method, the JsonSerializer is not able to convert the result to the MyClass type. If I modify this code and return a string object, I am able to convert it in the controller. I was wonder how to solve this issue?

0

There are 0 best solutions below