[英]Implement Repository and Db Context .Net Core Console Entity Framework with DI
I am creating a .NET Core 6 console application.我正在创建一个 .NET Core 6 控制台应用程序。
I have a repository class StorageCompetitorRepository
that implements an interface IStorageCompetitorRepository
.我有一个实现接口IStorageCompetitorRepository
的存储库类StorageCompetitorRepository
。
The following is breaking and showing as null in Program.cs
when I try to initialize:当我尝试初始化时,以下内容在Program.cs
中中断并显示为 null:
_storageCompetitorRepository = serviceProvider.GetService<StorageCompetitorRepository>();
The StorageCompetitorRepository
class initializes the DbContext
through the constructor. StorageCompetitorRepository
类通过构造函数初始化DbContext
。
Program.cs
: 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
: 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
: 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");
}
}
Why is my initializing of the repo class showing as null when adding it as a transient service?为什么将 repo 类的初始化添加为临时服务时显示为 null?
Any ideas or suggestions would be appreciated.任何想法或建议将不胜感激。
You are registering the interface but asking for the concrete implementation.您正在注册接口但要求具体实现。
Here you are saying "When resolving a IStorageCompetitorRepository, give me the StorageCompetitorRepository"在这里你说“当解析 IStorageCompetitorRepository 时,给我 StorageCompetitorRepository”
var services = new ServiceCollection()
.AddTransient<IStorageCompetitorRepository, StorageCompetitorRepository>();
Later you are trying to resolve the concrete implementation of the repository and the DI can't find it, since it has only been registered in the container as the interface, makes sense?稍后您尝试解决存储库的具体实现并且DI找不到它,因为它只是在容器中注册为接口,有意义吗? Change this:改变这个:
_storageCompetitorRepository = serviceProvider.GetService<StorageCompetitorRepository>();
To this:对此:
_storageCompetitorRepository = serviceProvider.GetService<IStorageCompetitorRepository>();
If you WANT to be able to resolve the concrete implementation, you will need to register it.如果您希望能够解决具体的实现,则需要注册它。
AddTransient<StorageCompetitorRepository>();
You can then ALSO register it as the interface like this if you want to be able to resolve it via the interface as well.如果您也希望能够通过接口解决它,那么您也可以将其注册为这样的接口。
AddTransient<IStorageCompetitorRepository, StorageCompetitorRepository>();
Or或者
AddTransient<IStorageCompetitorRepository>(x => x.GetRequiredService<StorageCompetitorRepository);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.