Funq:多次注册同一个对象并使用标识符(来自会话)来解决它们

问题描述 投票:1回答:1

我目前拥有的:

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

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

通过简单地在我的构造函数中注入它再次使用字典。所以我总是用每个DbContext注入整个字典。之后,我通过使用存储在我的usersession中的标识符来获取正确的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自动为我解析正确的对象,具体取决于我的会话中特定属性的值。

如果有人知道答案我会非常感激。

c# .net servicestack funq
1个回答
1
投票

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

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

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()));
}

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

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());
© www.soinside.com 2019 - 2024. All rights reserved.