Я занимаюсь этим вопросом в течение нескольких часов, поэтому я решил написать и попросить о помощи.Внедрение в другой проект/сборку
Есть много ответов уже на этом форуме, которые я могу определить как решение моей проблемы, но я просто не могу соединить все точки внутри моей головы; и я не делаю этого.
Я пытаюсь изменить инжектор на большое приложение MVC, от StructureMap до SimpleInjector.
Мне нужно правильно передать текущего пользователя HttpContext другому проекту в том же решении, содержащем все репозитории и DBContext, чтобы его можно было использовать/записывать, когда выполняю некоторые операции CRUD.
Я явно не понял, как была создана проводка StructureMap; Мне было сложно. Я это на проекте MVC (может предоставить больше информации, потому что десятка классов с использованием StructureMap):
public class GlobalRegistry : StructureMap.Registry
{
public GlobalRegistry()
{
For<INotificationRepository>().Use<NotificationRepository>();
...
и на репозиториев проекта/класс:
public class NotificationRepository : BaseRepository,INotificationRepository
{
public NotificationRepository(string userContext) : base(userContext) { }
(... по magic ...) конструктор будет использовать параметр userContext для использования позже в вызываемом методе.
После замены SimpleInjector я не понимаю, как этот параметр вводится.
Для целей тестирования, это работает:
container.Register<INotificationRepository>(() => new NotificationRepository("username"),
Lifestyle.Singleton);
Я прочитал, что я не должен вводить HttpContext
в конструкторе, так как это является переменной во время выполнения, и я понимаю, почему.
Дальше Я пробовал IUserContextFactory
, но это тоже не сработало.
На том же проекте MVC, у меня есть свой класс:
public static class ObjectFactory
{
private static SimpleInjector.Container _container;
public static void SetContainer(Container container)
{
ObjectFactory._container = container;
}
public static T GetInstance<T>() where T : class
{
return _container.GetInstance<T>();
}
}
Я использую этот класс, чтобы хранить контейнер после container.Verify();
ObjectFactory.SetContainer(container);
На любом контроллере MVC Я использую его, как это :
IUserContext ctxUser = ObjectFactory.GetInstance<IUserContext>();
Я также пробовал что-то вроде следующего в репозитории на протяжении всего моего но я всегда получаю нуль UserName
.
public NotificationRepository(IUserContext userContext) : base(userContext) { }
(общий интерфейс между проектом MVC и проектом хранилища)
public interface IUserContext
{
string Username { get; set; }
}
более важен, чем знать решение, я хотел бы понять, как решение работает и преодолеть трудности, у меня были в течение последних нескольких часов пытался понять и решить эту проблему.
Ну, также должна быть регистрация для контекста в 'StructureMap', конвертировать его в другой синтаксис. Кстати, этот «Lifestyle.Singleton» выглядит не очень хорошо. –
Я не понимаю, какова ваша фактическая проблема, где вы застряли и что именно вы пытаетесь понять. – Steven
@ Герт Арнольд, не нашел контекста на вставке StructureMap. Когда пользователь входит в систему, он остается прежним до тех пор, пока он не выйдет из системы, где я что-то пропущу? Несколько пользователей !? – chapas