Funq: зарегистрировать один и тот же объект несколько раз и использовать идентификатор (из сеанса) для их разрешения - PullRequest
0 голосов
/ 04 сентября 2018

Что у меня сейчас есть:

У меня есть простой словарь типа 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 автоматически разрешал нужный мне объект, в зависимости от того, какое значение имеет конкретное свойство из моего сеанса.

Если кто-нибудь знает ответ, я был бы очень признателен.

1 Ответ

0 голосов
/ 04 сентября 2018

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

Или вы можете использовать методы Extension, если вам не нужен базовый класс, например:

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

Затем лениво загрузите его в свой класс обслуживания, как:

DbContext dbContext;
public DbContext DbContext => dbContext ?? (dbContext = this.GetDbContext());
...