简体   繁体   English

使用 DI 实现 Repository 和 Db Context .Net Core Console Entity Framework

[英]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.

相关问题 .Net 5 控制台后台服务异常与 Entity Framework Core 的 DI - .Net 5 Console Background service exception with DI of Entity Framework Core 使用实体框架 2.2 在 .net core 中启用 DB 上下文日志记录 - Enable DB context logging in .net core with entity framework 2.2 .Net Core Entity Framework Generic Repository Pattern - 使用 UnitOfWork 实现共享服务 - .Net Core Entity Framework Generic Repository Pattern - Implement Shared Service With UnitOfWork 实体框架核心在内存中存储db上下文之外的实体 - Entity Framework Core store an entity outside of db context in memory Entity Framework Core:单个数据库上下文实例的日志查询 - Entity Framework Core: Log queries for a single db context instance 带上下文的Asp.net核心DI - Asp.net core DI with context .Net Core 中的通用存储库模式与实体框架有什么相关性 - What is the relevance of the Generic Repository Pattern in .Net Core with Entity Framework 实体框架和 ASP.NET Core UOW 存储库模式 - Entity Framework and ASP.NET Core UOW Repository pattern Net Core:通用存储库主 ID 实体框架中的关键性能 - Net Core: Generic Repository Primary Id Key Performance in Entity Framework 登录控制台应用程序(带有 DI 的 .NET Core) - Logging in console application (.NET Core with DI)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM