首页 > 解决方案 > 使用 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 应该如何注入选项的值,因为它依赖于无参数构造函数。我考虑实现空构造函数并以某种方式获取服务,手动获取值,但在我看来这是一个巨大的危险信号。

我应该如何处理这样一个类的设计?

标签: c#entity-frameworkdependency-injectionappsettings

解决方案


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

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>在实体构造函数中要求的限制。


推荐阅读