在这个论坛上已经有很多答案可以被认为是我的问题的解决方案,但是我就是不能在脑海中将所有的东西联系起来;而且我做不好。
我正在尝试将注射器从StructureMap更改为SimpleInjector,用于一个大型MVC应用程序。
我需要正确地将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) { }
(...通过魔法...) 构造函数将接受 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
看起来不太好。 - Gert Arnold