1

我目前拥有的:

我有一个简单的字典类型string, DbContext 我正在像这样注册我的字典

container.Register<IDictionary<string, DbContext>>(x => dbContexts).ReusedWithin(ReuseScope.Request);

并通过简单地将字典注入我的构造函数来再次使用字典。所以我总是用其中的每个 DbContext 注入整个字典。然后,我通过使用存储在我的用户会话中的标识符来获得正确的 DbContext。所以使用 DbContext 看起来像这样:

private readonly IDictionary<string, DbContext> _dbContexts;
public FooService(IDictionary<string, DbContext> dbContexts)
{
    _dbContexts = dbContexts;
}

public void Bar()
{
    var userSession = GetSession();

    var data = _dbContexts[userSession.TargetConnectionIdentifier].Table.ToList();
}

我想要的是

我只想将一个 DbContext 注入到我的类中。使用我会话中的相同属性作为标识符。我已经看到 Funq 提供了使用名称(例如RegisterAs<>())注册实例的方法。但我不太确定如何正确使用它们。

private readonly DbContext _dbContext;

public FooService(DbContext dbContext)
{
    _dbContext = dbContext;
}

我希望 Funq 自动为我解析正确的对象,具体取决于我的会话中特定属性的值。

如果有人知道答案,我将不胜感激。

4

1 回答 1

1

IOC 无权访问运行时请求上下文,因此您无法在 IOC 内执行此操作。

我的方法是使用数据库上下文注册工厂,例如:

container.Register<IDbContexts>(c => new DbContexts(dbContexts));

然后你可以有一个基类,它提供一个帮助器来访问一个帮助器的DbContext背后,例如:

public class ServiceBase : Service
{
    public IDbContexts DbContexts { get; set; }

    DbContext dbContext;
    public DbContext DbContext => dbContext ?? (dbContext = DbContexts.Get(GetSession()));
}

或者,如果您不想要基类,您可以使用扩展方法,例如:

public static class MyServiceExtensions
{
    public static DbContext GetDbContext(this Service service)
    {
        var dbContexts = service.TryResolve<IDbContexts>();
        return dbContexts.Get(service.GetSession());
    }
}

然后将其延迟加载到您的 Service 类中,例如:

DbContext dbContext;
public DbContext DbContext => dbContext ?? (dbContext = this.GetDbContext());
于 2018-09-04T20:11:12.247 回答