我目前拥有的:
我有一个类型为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自动为我解析正确的对象,具体取决于我的会话中特定属性的值。
如果有人知道答案我会非常感激。
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());