MVC视图层中MongoDB连接信息的依赖注入

5

我正在尝试熟悉依赖注入,在使用 .Net Core 的 MVC 和数据层处理 MongoDB 信息的分层解决方案中,遵循以下教程:https://code-maze.com/getting-started-aspnetcore-mongodb/

我的 .sln 设置如下:

项目 A ---- MVC 层

项目 B ---- MongoDB 层

我想做的是在视图中使用我在 DB 层定义的函数来显示文档的信息。我遇到的问题是如何在 Index.cshtml 中调用该函数。

按照教程,我首先制作了一个接口,从服务中提取连接信息。由于 A 依赖于 B,因此我将其写在 B 中:

namespace DataLayer
{
    public class MyDBSettings : IDotNetStudyDBSettings
    {
        public string FileHistoryCollectioName { get; set; }
        public string FileResultsCollectionName { get; set; }
        public string ConnectionString { get; set; }

        public string DatabaseName { get; set; }



    }


    public interface IDotNetStudyDBSettings
    {
        string FileHistoryCollectioName { get; set; }
        string FileResultsCollectionName { get; set; }
        string ConnectionString { get; set; }
        string DatabaseName { get; set; }



    }
}

我已经在我的Startup.cs中配置了我的服务,以便将信息传递给这个接口。根据教程,我还为我要提取的集合创建了实体模型:

  public class File_History
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]

        public string Id { get; set; }
        public DateTime Date { get; set; }
        public string FileName { get; set; }

       

    }

    public class File_Result
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]

        public string Id { get; set; }
        public int Attempt { get; set; }
        public string CF_Output { get; set; }

        public string UR_Output { get; set; }

        
}

为了尝试检索集合,在.cshtml文件中我实例化了MyDBSettings类,并将其传递给我编写的用于检索Mongo内容的函数:
public class MongoDB_Communicator
    {
         IMongoCollection<File_History> _filehistory;

        public IMongoCollection<File_History> FileService(IDotNetStudyDBSettings settings)
        {
            var client = new MongoClient(settings.ConnectionString);
            var database = client.GetDatabase(settings.DatabaseName);
            _filehistory = database.GetCollection<File_History>(settings.FileHistoryCollectioName);
            return (_filehistory);

        }
    }

这是我最终编写的 .cshtml 代码:

@{ 

    DataLayer.MyDBSettings test_sets = new DataLayer.MyDBSettings();
    MongoDB_Communicator test_cm = new MongoDB_Communicator();
  

}

@{
    
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Drag Python (3) File Below. No funny business or you're out.</p>
    <p>
    
    
    @{
        test_cm.FileService(test_sets);





        }</p>

</div>

这导致了以下错误消息:

我是个傻瓜

编辑:我已经在我的appsettings.Json中进行了配置,如下所示(已编辑以删除登录信息)

Appsettings

我的问题是,当实际检索信息时,应该使用什么语法从我创建的接口中检索该设置信息?

我在我的StartUp.cs中设置了以下内容 - 我认为通过将该类添加到服务中,一旦实例化就会被填充。

public void ConfigureServices(IServiceCollection services)
        {
            //notate all of this
            services.Configure<MyDBSettings>(Configuration.GetSection(nameof(MyDBSettings)));
            services.AddSingleton<IDotNetStudyDBSettings>(provider => provider.GetRequiredService<IOptions<MyDBSettings>>().Value);
            services.AddControllersWithViews();
            services.AddControllers();
            services.AddScoped<MongoDB_Communicator>();
        }

我觉得这里存在一个概念上的差距:希望得到任何帮助!

1个回答

2
您的appsettings.json中的部分名称必须与您想在这里配置的部分相匹配。
 services.Configure<MyDBSettings>(Configuration.GetSection("DotNetCore_Study"));

嗨,Kammerl,感谢您的回复!快速问题 - 我仍然在上面的更新中遇到错误。Configuration.GetSection是否正在寻找我尝试注入依赖项的类?还是其他什么? - 36m_901gs
Configuration.GetSection 方法查找在参数字符串中定义的部分是否可以在 appsettings.json 文件中找到,并将其注入服务中作为 MyDBSettings。 - Kammerl
我觉得你的回答指引了我正确的方向,但是我有一个问题——在更新了那个参数之后,我仍然收到一个空字符串错误。这是否表明我将信息传递给函数的方式不正确?还是我的 Startup.cs 配置仍然存在问题? - 36m_901gs
仍然存在Startup.cs的问题,因为它表明仍然无法从appsettings.json中读取值。 - Kammerl
也许问题在于你的 MongoDB_Communicator 类没有构造函数,而 DI 需要一个构造函数。 - Kammerl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接