c# - 使用 IOptions 设计一个类由EF处理?
问题描述
我有一个类带有一些我存储在数据库中的信息。
class SomeThing
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Info => "extra info";
}
自然,最后一个属性被 EF 省略了entity.Ignore(a => a.Info);
。现在,我希望可以从设置文本额外信息appsettings.json
,因此我引入了一个选项提供程序并使用构造函数注入它(在将其注册后Startup.cs
)。DI 要求我使用参数化构造函数,而 EF 需要无参数构造函数,因此我的类变得有点堵塞。
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 应该如何注入选项的值,因为它依赖于无参数构造函数。我考虑实现空构造函数并以某种方式获取服务,手动获取值,但在我看来这是一个巨大的危险信号。
我应该如何处理这样一个类的设计?
解决方案
不管这是一个有问题的设计决定,您都应该将这项工作委托给存储库类。
ThingRepo.GetSomeThing()
如果需要,获取实体并填充Info
属性。然后它可以注入IOptions<T>
构造函数。
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>
在实体构造函数中要求的限制。
推荐阅读
- android - Glide 占位符缓存
- javascript - 为什么每次渲染都会调用 `useEffect` 的清理功能?
- asp.net-core - 如何在cshtml文件中使用引导程序4将3个下拉选择表单连续放置
- javascript - jQuery:分离表行然后追加回相同的位置
- kubernetes - 如何在 helm 图表中获取 pod 索引
- r - 更改多个列表的列表元素名称
- java - java.lang.StackOverflowError 但我没有循环任何东西
- spring-security - 如何允许匿名访问端点
- kubernetes - 如何使用 helm 从目录创建 ConfigMap
- r - 按数据框中的行名对数据进行排序