首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用EF处理的IOptions<T>设计类?

使用EF处理的IOptions<T>设计类?
EN

Stack Overflow用户
提问于 2021-09-13 23:00:20
回答 2查看 61关注 0票数 0

我有一个类包含一些我存储在数据库中的信息。

代码语言:javascript
运行
AI代码解释
复制
class SomeThing
{
  public Guid Id { get; set; }
  public string Name { get; set; }
  public string Info => "extra info";
}

当然,entity.Ignore(a => a.Info);的EF省略了最后一个属性。现在,我希望文本额外的信息可以从appsettings.json中设置,所以我引入了一个选项提供程序,并使用构造函数(在Startup.cs中注册它之后)注入它。DI要求我使用一个参数化的构造函数,而EF则需要一个无参数的构造函数,因此我的类变得有点阻塞。

代码语言:javascript
运行
AI代码解释
复制
class SomeThing
{
  private IOptions<Config> Config { get; }

  public SomeThing() { }
  
  public SomeThing(IOptions<Config> config)
  { 
    Config = config;
  }

  public Guid Id { get; set; }
  public string Name { get; set; }
  public string Info => Config.Value.Info;
}

现在,笨重的复杂性让我怀疑我的设计有缺陷。另外,我不认为EF应该如何注入选项的值,因为它依赖于无参数的构造函数。我考虑过实现空构造函数并以某种方式获取服务,手动获取值,但在我看来,这是一个巨大的危险标志。

我应该如何对待这类课程的设计?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-14 04:41:43

不管这是一个有问题的设计决策,您都应该将这项工作委托给存储库类。

ThingRepo.GetSomeThing()获取实体并在需要时填充Info属性。然后,它可以在构造函数中注入IOptions<T>

代码语言:javascript
运行
AI代码解释
复制
class ThingRepo
{
    private Config _config;
    private DbContext _db;

    public ThingRepo(IOptions<Config> config, DbContext db)
    {
        _db = db;
        _config = config.Value;
    }

    public async Task<Thing> GetSomeThing()
    {
        var thing = await _db.Set<Thing>().FirstAsync();
        thing.Info = _config.Info;
        return thing;
    }
}

这避免了必须在实体构造函数中要求IOptions<T>的限制。

票数 2
EN

Stack Overflow用户

发布于 2021-09-14 01:08:37

由于SomeThing是数据库的实体定义,所以我避免使用DI向其中注入选项。我不认为这是一个支持的方案在EF核心无论如何。

如果您确实需要访问Info对象,您可以引用另一个与DI兼容的服务,但同样,直接从调用代码访问从SomeThing访问Info不会更容易吗?

通常,EF核心用于将数据存储在数据库中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69173191

复制
相关文章
Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
发布于 2018-03-18 12:45 更新于 2018-06-02 01:26
walterlv
2018/09/18
1.8K0
Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
.Net 编译器平台 --- Roslyn
最近做一个功能想要动态执行C#脚本,就是预先写好代码片段,在程序运行时去执行代码段,比如像这样(以下代码为伪代码):
Niuery Diary
2023/10/22
3830
.Net 编译器平台 --- Roslyn
matlab怎么显示当前文件夹和工作区
1、第一步在我们的电脑上打开matlab,可以看到界面上目前没有显示当前文件夹和工作区,如下图所示:
狼啸风云
2020/07/15
12.9K0
matlab怎么显示当前文件夹和工作区
译 | 使用Roslyn分析器高效编写更好的代码
Roslyn 是 .NET 编译器平台,即使在运行代码之前,它也能帮助您捕获 Bug。例如内置于 Visual Studio 中的Roslyn 拼写检查分析器。
Edi Wang
2019/07/17
2.4K0
译 | 使用Roslyn分析器高效编写更好的代码
工作区介绍
1.一个代码包可以有多个以.go为扩展名的源码文件组成如下,demo1.go demo2.go 和 main.go 都属于代码包main,注意同一个目录下的.go 文件只能属于一个代码包
酷走天涯
2019/06/11
8230
工作区介绍
修复 React 代码中烦人的 Warning
react的diff算法是把key当成唯一id然后比对组件的value来确定是否需要更新的,所以如果没有key,react将不会知道该如何更新组件。你不传 key 也能用是因为 react 检测到子组件没有 key 后,会默认将数组的索引作为 key。react根据key来决定是销毁重新创建组件还是更新组件,原则是:
ConardLi
2020/12/15
2.4K0
修复 React 代码中烦人的 Warning
Git工作流程、工作区、缓存区、版本库
暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
子润先生
2021/07/08
1.1K0
MatLab工作区
MatLab 中的基础工作区是针对当前 MatLab 窗口内的脚本代码而言的(无论是命令行窗口输入的还是 M 脚本文件中的),是所有脚本代码所共享的(即对当前 MatLab 窗口而言是唯一的),是对外可见的(即 MatLab 窗口中显示的工作区),与当前 MatLab 窗口是共存亡的。
hotarugali
2022/03/01
1.3K0
git mv 从工作区和暂存区中重命名内容
它会将内容从工作区和暂存区中重命名,手动重命名需要执行两步操作,git mv 一步即可
很酷的站长
2022/12/16
4790
git mv 从工作区和暂存区中重命名内容
Roslyn 判断当前使用 dotnet core 编译器进行编译
在写 msbuild 预编译或编译调度逻辑时,如何知道当前执行的编译器使用的是上古版本的 msbuild 还是用了 dotnet core 内核的 Roslyn 编译器?本文解决的问题是我期望在 Windows 系统使用 .NET Framework 版本的工具,而在非 Windows 系统上,使用 dotnet core 版本的工具。原因是 .NET Framework 在开发者设备上都会有,用起来简单。而 dotnet core 提供了跨平台,可以在其他平台上使用
林德熙
2021/01/07
4630
Git之工作区和暂存区
工作区和暂存区 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。 先来看名词解释。 工作区(Working Directory) 就是你在电脑里能看到的目录,比如
兮动人
2021/06/11
9170
Git之工作区和暂存区
Git 工作区、暂存区与版本库
基本概念 工作区 在电脑中能看到的目录 工作区.jpg 此处的 initialize 文件夹可被看作为工作区 暂存区 一般存放在 .git 目录下的 index 文件中,也将暂存区称作索引 未提交的文件修改通通放在暂存区中 暂存区.jpg 版本库 工作区中的 .git 目录(.git 为隐藏目录) 版本库.jpg 添加文件到版本库中 把文件添加到暂存区中 把暂存区的所有内容提交到当前分支 添加暂存区 将工作区中的文件添加到暂存区 语法 git add 文件名 添加暂存区.jpg 添加完成之后查看本地库状
Emperor_LawD
2021/08/20
7530
Git 工作区、暂存区与版本库
Git教程2(工作区和暂存区)
注意 update2也被撤销了,因为上个案例中update2也是被添加后没有执行add操作,所以一并也被撤销了。
用户4919348
2019/04/02
1K0
Git教程2(工作区和暂存区)
Git工作区、版本库与暂存区
Git与其它版本控制系统如SVN的一个最大的不同之处就是发明了暂存区的概念,本文从创建Git版本库开始,依次描述了追踪文件、修改文件、丢弃修改、提交修改等基本Git操作,在此过程中介绍了Git版本控制系统中三个重要概念:工作区、版本库与暂存区。
我是东东东
2018/08/01
8690
Git工作区、版本库与暂存区
git-工作区、暂存区、版本库
就是 git init 的目录,就是工程目录。 工作区下包含着版本库 .git 文件夹。
潇洒
2023/10/20
2340
git-工作区、暂存区、版本库
动态代码框架发布-CZGL.Roslyn
开源项目位置:https://github.com/whuanle/CZGL.CodeAnalysis
痴者工良
2021/04/26
1.2K0
Service Broker 无法工作的问题修复
数据库的Service Broker在通过备份/还原方式恢复数据库后,通过SELECT * FROM sys.transmission_queue 查到的错误信息: An exception occurred while enqueueing a message in the target queue. Error: 15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not e
张善友
2018/01/19
1K0
内存四区之代码区,全局区,栈区和堆区
C++ 在程序执行时,将内存大致分为代码区,全局区,栈区和堆区四个区域。不同的区域存储不同的数据,赋予不同的生命周期,能够更灵活地进行编程。
呆呆
2021/07/05
2.3K0
roslyn 生成代码_delphi反编译为源码
Roslyn 是微软公司开源的 .NET 编译器。编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API。 GITHUB地址:https://github.com/dotnet/roslyn.git
全栈程序员站长
2022/09/30
5390
roslyn 生成代码_delphi反编译为源码
点击加载更多

相似问题

Roslyn是否支持项目/编译级诊断的代码修复操作(没有位置)?

10

无法创建新的“诊断与代码修复”项目!(Roslyn+VS2013)

16

Resharper支持Roslyn诊断和快速操作的代码修复

115

非文本的Roslyn代码诊断报告?

11

Roslyn诊断注册

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档