Чутьё вас не обманывает, мне кажется с текущим интерфейсом/реализацией IFactory{T} вы можете их убрать (IFactory{T}/Factory{T}) и инжектить напрямую Func{T} - т. к. всё, что делает Factory{T} - вызывает внедрённый Func{T}.
Далее, если вам нужно передать что-то через DI - это что-то в первую очередь нужно в DI контейнере зарегистрировать. Т. е. вам нужен по желанию интерфейс + реализация либо просто класс параметров, как-то так например:
public interface ISessionParameters
{
string ClientName { get; }
string UserName { get; }
string Password { get; }
}
internal sealed class DefaultSessionParameters : ISessionParameters
{
public string ClientName => "ClientName";
public string UserName => "UserName";
public string Password => "Password";
}
Реализацию нужно зарегистрировать в DI контейнере и куда-нибудь внедрить. С учётом того, что у вас сессия берётся напрямую из контейнера - параметры можно пробросить прямо через конструктор сессии.
Однако более правильный вариант - передавать параметры через фабрику сессий, что в принципе у вас и происходит. Если хочется именно так - есть вариант создавать сессию руками через конструктор, пробросив недостающие зависимости через конструктор фабрики. Ещё есть вариант инжектить не Func{ISession}, а Func{ISessionParameters, ISession}, и настроить контейнер соответствующим образом.
Ещё насчёт SessionFactory - возможно будет проще воспринимать его как SessionManager. Тогда SessionManager мог бы использовать что-то типа SessionFactory.Create(ISessionParameters) (или Func{ISessionParameters, ISession}), а SessionFactory мог бы создавать какой-то конкретный тип сессий с переданными параметрами и пробрасывать зависимости из контейнера в конструктор сессии. Т. е. вот так:
public interface ISessionFactory
{
ISession Create(ISessionParameters parameters);
}
internal sealed class SessionFactory
{
// Можно и здесь передать параметры - в зависимости от задачи
public SessionFactory(ILogger<Session> logger, IHttpClientFactory httpClientFactory)
{
// Запоминаем
}
public ISession Create(ISessionParameters parameters)
{
// В сессию передаём также параметры.
return new Session(_logger, _httpClientFactory, parameters);
}
}