【问题标题】:How to properly implement Repository pattern with Db Context .Net Core Console Entity Framework with DI如何使用 Db Context .Net Core Console Entity Framework 和 DI 正确实现存储库模式
【发布时间】:2022-10-18 23:32:17
【问题描述】:

我正在创建一个 .NET Core 6 控制台应用程序。

我有一个实现接口IStorageCompetitorRepository 的存储库类StorageCompetitorRepository

当我尝试初始化时,以下内容在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");
    }
}

为什么将 repo 类的初始化添加为临时服务时显示为 null?

任何想法或建议将不胜感激。

【问题讨论】:

    标签: c# .net-core dependency-injection entity-framework-core console-application


    【解决方案1】:

    您正在注册接口但要求具体实现。

    在这里你说“当解析 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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多