C# 使用ASP.NET核心DI注册接口的通用和特定实现
我读了Armen Shimoon的文章,决定使用他建议的技术解决我的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不提供类的所有接口/子类
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>();