MajidH
MajidH

Reputation: 1

Custom IServiceProvider in .NET Core 3.0 can't resolve a service

I'm integrating MEF1 with .NET Core 3.0's DI framework. My goal is to use MEF1 for service resolution and fall back to the default DI if MEF1 can't resolve a service.

Here’s my implementation:

MefServiceProviderFactory:


public class MefServiceProviderFactory : IServiceProviderFactory<IDependencyResolver>
{
    private ServiceProvider m_defaultServiceProvider;

    public IDependencyResolver CreateBuilder(IServiceCollection services)
    {
        m_defaultServiceProvider = services.BuildServiceProvider();
        MefDependencyResolver.Initialize(AppContext.BaseDirectory);
        return DependencyResolver.Instance;
    }

    public IServiceProvider CreateServiceProvider(IDependencyResolver resolver) =>
        new MefServiceProvider(resolver, m_defaultServiceProvider);
}
MefServiceProvider:

public class MefServiceProvider : IServiceProvider
{
    private readonly IDependencyResolver m_resolver;
    private readonly ServiceProvider m_defaultServiceProvider;

    public MefServiceProvider(IDependencyResolver resolver, ServiceProvider defaultServiceProvider)
    {
        m_resolver = resolver ?? throw new ArgumentNullException(nameof(resolver));
        m_defaultServiceProvider = defaultServiceProvider ?? throw new ArgumentNullException(nameof(defaultServiceProvider));
    }

    public object GetService(Type serviceType) =>
        m_defaultServiceProvider.GetService(serviceType) ?? m_resolver.GetInstanceOrNull(serviceType);
}

Service Registration:


services.AddTransient<IForecastService, ForecastService>();

Program.cs :

public static IHostBuilder CreateHostBuilder(string[] args) => Host
            .CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new MefServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());

When I put a breakpoint in GetService(), it's called for IConfiguration and IHost, but not for IForecastService. It seems like the default DI is still being used instead of the custom one.

What could be causing this, and how can I ensure my custom MefServiceProvider resolves IForecastService correctly?

Upvotes: 0

Views: 63

Answers (0)

Related Questions