如何使用DB上下文正确实现存储库模式。NET

发布于 2025-01-27 21:55:55 字数 3626 浏览 3 评论 0原文

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

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

以下是program.cs在我尝试初始化时的null:

  _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添加为瞬态服务的repo类的初始化?

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

I am creating a .NET Core 6 console application.

I have a repository class StorageCompetitorRepository that implements an interface IStorageCompetitorRepository.

The following is breaking and showing as null in Program.cs when I try to initialize:

  _storageCompetitorRepository = serviceProvider.GetService<StorageCompetitorRepository>();

The StorageCompetitorRepository class initializes the DbContext through the constructor.

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(
quot;{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");
    }
}

Why is my initializing of the repo class showing as null when adding it as a transient service?

Any ideas or suggestions would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风月客 2025-02-03 21:55:56

您正在注册接口,但要求进行具体的实现。

在这里,您是在说:“解决一个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);

You are registering the interface but asking for the concrete implementation.

Here you are saying "When resolving a IStorageCompetitorRepository, give me the 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?
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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文