Внедрение в конструктор Unity как параметр времени выполнения - PullRequest
0 голосов
/ 07 февраля 2019

Я создаю Web API (шаблон репозитория) с Unity в качестве контейнера DI.

Мой сервис использует репозиторий, который принимает зарегистрированный идентификатор пользователя в качестве параметра.Этот параметр идентификатора пользователя должен исходить из заголовка http-запроса.

Мой репозиторий:

public class UserRepository : IUserRepository
{
    private readonly UserInformationObj _userInformation;

    public UserRepository(Guid currentUserId)
    {       
        _userInformation = LoadUserData(currentUserId.ToString());
    }
}

Конфигурация Unity:

container.RegisterType<IUserRepository, UserRepository>(new InjectionConstructor(Guid.Empty));

Как получить значениеиз заголовка HTTP в единство?

Не уверен, что это похоже https://stackoverflow.com/a/11995346/1169180. Я не понял решения.Может ли кто-нибудь быстро подсказать мне, что именно нужно сделать?

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

Дело в том, что у вас есть две фазы с unity-container, регистрация и разрешение.Поскольку вы не знаете значение Guid при регистрации, вы должны удалить InjectionConstructor из регистрации.

container.RegisterType<UserRepository>();

С другой стороны, вы знаете Guid во время разрешения, исходит из запроса.Таким образом, идея состоит в том, чтобы разрешить IUserRepository и ввести туда Guid.Это означает, что с каждым запросом вы будете разрешать новый экземпляр репозитория и вставлять в него значение Guid ...

guid = Guid.Parse(request.Headers["CurrentUserId"])
var rep = _container.Resolve<UserRepository>(new ParameterOverride("currentUserId", guid));
...