【发布时间】:2016-11-15 19:32:09
【问题描述】:
我已经研究这个主题好几个小时了,所以我决定写信寻求帮助。
这个论坛上已经有很多答案可以用来解决我的问题,但是我无法将我脑海中的所有点都联系起来;而且我还没完成。
我正在尝试将大型 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) { }
(...by 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项目和repository项目的通用接口)
public interface IUserContext
{
string Username { get; set; }
}
比知道解决方案更重要的是,我想了解解决方案的工作原理,并克服过去几个小时试图理解和解决这个问题时遇到的困难。
【问题讨论】:
-
嗯,
StructureMap中的上下文也应该有一个注册,也应该将其转换为其他语法。顺便说一句,这个Lifestyle.Singleton不好看。 -
我不明白你的实际问题是什么,你在哪里卡住了,你想了解什么。
-
@Gert Arnold,没有找到关于正在注入的 StructureMap 的上下文。当用户登录时它保持不变,直到它注销,我在哪里错过了什么?多个用户!?
-
@Steven,我希望能得到你的答复,你是所有#simple-injector 选项卡上的常数。我的不好,我不知道如何解释/表达我自己,这就是问题所在。已经解决了我的问题。不确定我是否完全理解我自己的解决方案。我质疑了很多次...作为程序员的我...哦,这个帖子应该被删除它很混乱。
-
上下文必须已经注册。 IoC 容器如何知道如何将其注入存储库? (这对你来说是“魔法”,但只是配置)。
标签: c# entity-framework structuremap httpcontext simple-injector