Я создаю консольное приложение .NET Core 6.
У меня есть класс репозитория StorageCompetitorRepository, который реализует интерфейс IStorageCompetitorRepository.
Следующее ломается и отображается как null в Program.cs, когда я пытаюсь инициализировать:
_storageCompetitorRepository = serviceProvider.GetService<StorageCompetitorRepository>();
Класс StorageCompetitorRepository инициализирует DbContext через конструктор.
Program.cs:
using Microsoft.Extensions.DependencyInjection;
class Program
{
private static StorageCompetitorRepository _storageCompetitorRepository;
static void Main(string[] args)
{
// configure services
var services = new ServiceCollection()
.AddTransient<IStorageCompetitorRepository, StorageCompetitorRepository>();
// create service provider
var serviceProvider = services.BuildServiceProvider();
_storageCompetitorRepository = serviceProvider.GetService<StorageCompetitorRepository>();
bool runLoaderTool = true;
while (runLoaderTool)
{
runLoaderTool = ChooseElasticIndexMenu(runLoaderTool, _storageCompetitorRepository);
}
}
public static bool ChooseElasticIndexMenu(bool runLoaderTool, StorageCompetitorRepository storageCompetitorRepository)
{
// didn't add the full code that returns the boolean all you need
// to know that the repo class method is called here
storageCompetitorRepository.GetStorageCompetitors();
}
}
StorageCompetitorRepository:
public class StorageCompetitorRepository : IStorageCompetitorRepository
{
string DatabaseServer = ConfigurationManager.AppSettings["DataBaseServer"];
private readonly DevModelContext _devModelContext;
public StorageCompetitorRepository(DevModelContext devModelContext) => _devModelContext = devModelContext;
public List<storage_competitor> GetStorageCompetitors()
{
try
{
var ctx = _devModelContext.StorageCompetitors;
var storageCompetitorList = (from sc in ctx
where sc.active == true && sc.id_period == (from s in ctx select s).Max(s => s.id_period)
select sc).Distinct()
.OrderBy(sc => sc).ToList();
var countStorageCompetitors = storageCompetitorList.Count();
Console.WriteLine($"{countStorageCompetitors} Storage Competitors were found in SQL Server : {DatabaseServer} Database : Competitors");
return storageCompetitorList;
}
catch
{
return new List<storage_competitor>();
}
}
}
DevModelContext:
public class DevModelContext : DbContext
{
string connectionString = ConfigurationManager.ConnectionStrings["connCompetitorsDev"].ConnectionString;
public DevModelContext(DbContextOptions<DevModelContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(connectionString);
}
public DbSet<storage_competitor> StorageCompetitors { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<storage_competitor>().ToTable("storage_competitor");
}
}
Почему моя инициализация класса репо отображается как null при добавлении его в качестве временной службы?
Любые идеи или предложения будут оценены.





Вы регистрируете интерфейс, но запрашиваете конкретную реализацию.
Здесь вы говорите: «При разрешении IStorageCompetitorRepository дайте мне StorageCompetitorRepository».
var services = new ServiceCollection()
.AddTransient<IStorageCompetitorRepository, StorageCompetitorRepository>();
Позже вы пытаетесь решить конкретную реализацию репозитория, и DI не может ее найти, так как она была зарегистрирована в контейнере только как интерфейс, имеет смысл? Измените это:
_storageCompetitorRepository = serviceProvider.GetService<StorageCompetitorRepository>();
К этому:
_storageCompetitorRepository = serviceProvider.GetService<IStorageCompetitorRepository>();
Если вы ХОТИТЕ иметь возможность разрешить конкретную реализацию, вам необходимо ее зарегистрировать.
AddTransient<StorageCompetitorRepository>();
Затем вы можете ТАКЖЕ зарегистрировать его как интерфейс, подобный этому, если вы хотите иметь возможность разрешать его и через интерфейс.
AddTransient<IStorageCompetitorRepository, StorageCompetitorRepository>();
Или
AddTransient<IStorageCompetitorRepository>(x => x.GetRequiredService<StorageCompetitorRepository);
под ..AddTransient мне также пришлось сделать .AddDbContext