Ответы пользователя по тегу ASP.NET
  • Паттерн фабрики, и передача параметров в выпускаемый объект. Как?

    gdt
    @gdt
    Программист
    Чутьё вас не обманывает, мне кажется с текущим интерфейсом/реализацией 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);
        }
    }
    Ответ написан
    Комментировать
  • Как передать DateTime из View в Controller?

    gdt
    @gdt
    Программист
    Может ли это чем-то помочь? https://www.youtube.com/watch?v=dsk4YyDEn4w
    Ответ написан
    Комментировать