C# 使用ASP.NET核心DI注册接口的通用和特定实现

C# 使用ASP.NET核心DI注册接口的通用和特定实现,c#,asp.net-core,inversion-of-control,asp.net-core-mvc,C#,Asp.net Core,Inversion Of Control,Asp.net Core Mvc,我读了Armen Shimoon的文章,决定使用他建议的技术解决我的ASP.NET核心DI问题。 我有一个通用接口: public interface IItemRepository<out T> where T : BaseItem 为了 但是我不知道如何在IServiceCollection中注册它。或者我的方法根本不对?您不能明确注册它。ASP.NET核心DI意味着简单,提供开箱即用的DI/IoC体验,并便于其他DI/IoC容器插入 因此,内置的IoC不提供类的所有接口/子类

我读了Armen Shimoon的文章,决定使用他建议的技术解决我的ASP.NET核心DI问题。 我有一个通用接口:

public interface IItemRepository<out T> where T : BaseItem
为了


但是我不知道如何在IServiceCollection中注册它。或者我的方法根本不对?

您不能明确注册它。ASP.NET核心DI意味着简单,提供开箱即用的DI/IoC体验,并便于其他DI/IoC容器插入

因此,内置的IoC不提供类的所有接口/子类型的自动注册、程序集扫描、装饰器或注册

对于具体的实现,有一个“变通方法”


但实际上,如果您将
IItemRepository
注入到您的服务中,则OpenGeneric应该已经涵盖了这种情况

您不能显式注册它。ASP.NET核心DI意味着简单,提供开箱即用的DI/IoC体验,并便于其他DI/IoC容器插入

因此,内置的IoC不提供类的所有接口/子类型的自动注册、程序集扫描、装饰器或注册

对于具体的实现,有一个“变通方法”

但实际上,如果您将
IItemRepository
注入到您的服务中,则OpenGeneric应该已经涵盖了这种情况

public class ItemRepository<T> : IItemRepository<T> where T : BaseItem
services.AddSingleton(typeof(IItemRepository<>), typeof(ItemRepository<>));
public class CurrencyRepository : ItemRepository<Currency>
CurrencyRepository
IItemRepository<Currency>
ItemRepository<T>
public class ItemRepositoryFactory : IServiceFactory> where T : BaseItem
{
    private readonly ApplicationDbContext _context;

    public ItemRepositoryFactory(ApplicationDbContext context)
    {
        _context = context;
    }

    public ItemRepository Build()
    {
        if (typeof(T) == typeof(Currency))
            return new CurrencyRepository(_context) as ItemRepository;

        return new ItemRepository(_context);
    }
}
services.AddScoped<IMyService,MyService>();
services.AddScoped<MyService>(provider => provider.GetService<IMyService>());
services.AddScoped<IItemRepository<Currency>,CurrencyRepository>();