- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从一开始就没有正确实现的旧版本 (2.6) 升级后,我目前正在尝试在我们的应用程序中重新配置 StructureMap。我是刚开始使用 DI 容器的新手,并且很难找到新版本 StructureMap 的文档。我卸载了旧的 2.6 版本的 StructureMap 并安装了 StructureMap.MVC5(因为我使用的是 MVC5)。
我遇到的问题是 AccountController。我将 StructureMap 设置为使用无参数构造函数,但是当我的应用程序尝试创建 UserManager 时,我得到一个 InvalidOperationException
,“No owin.Environment item was found in the context.”
显然我需要为 StructureMap 进行额外的配置,但我不知道是什么/如何。我可以找到这个错误的一百万个来源,所有这些都建议在 web.config 中添加一个标签,但它们似乎都不是特定于 DI 容器的 - 我只有在使用 StructureMap 与让框架创建 Controller 时才会遇到这个问题。
下面是相关代码; AccountController 的那部分只是库存模板代码。
private ApplicationUserManager _userManager;
public AccountController()
{
}
public AccountController(ApplicationUserManager userManager)
{
UserManager = userManager;
}
public ApplicationUserManager UserManager
{
get
{
// This is where the exception is thrown
return _userManager ??
HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
public DefaultRegistry()
{
Scan(
scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
For<IBasicRepository>()
.Use<EntityRepository>()
.LifecycleIs<HttpContextLifecycle>()
.Ctor<string>("ConnectionString")
.Is(ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString);
For<AccountController>()
.Use<AccountController>()
.SelectConstructor(() => new AccountController());
}
最佳答案
正如@Erik Funkenbusch 指出的那样,我在做相互竞争的事情。我最终使 UserManager 成为一个自动属性,删除了无参数构造函数,并让 StructureMap 注入(inject) ApplicationUserManager。
public ApplicationUserManager UserManager { get; private set; }
public AccountController(ApplicationUserManager userManager)
{
UserManager = userManager;
}
然后,我只需要配置 Identity 在 DefaultRegistry.cs 中使用的 IUserStore 和 DbContext:
For<IUserStore<ApplicationUser, int>>()
.Use<UserStore<ApplicationUser, CustomRole, int, CustomUserLogin,
CustomUserRole, CustomUserClaim>>()
.LifecycleIs<HttpContextLifecycle>();
For<DbContext>()
.Use(() => new ApplicationDbContext())
.LifecycleIs<HttpContextLifecycle>();
这就是让 StructureMap.MVC 与 Identity 一起工作所需要做的全部工作。
我最初挂断电话的部分原因是我没有意识到 StructureMap.MVC(和其他 DI 容器)的工作方式。 (参见 my related question。)我期待它只与我的股票 AccountController 一起工作,它由框架初始化(并认为它神奇地拦截了对象创建以注入(inject)我配置的任何东西),没有意识到 StructureMap 必须初始化 Controller 本身命令它执行构造函数注入(inject)。所以当我遇到问题时,我是 A。首先我对 StructureMap 与我的 AccountController 有任何关系感到惊讶(因为我没有明确为其任何参数配置注入(inject) - 仅针对我在其他 Controller 中使用的存储库),和 B. 我没有考虑更改我的股票代码,而是考虑如何配置 StructureMap。事实证明我需要两者都做。幸运的是,这是一个简单的修改,我对 DI 容器的工作原理有了更多的了解。
关于c# - 配置 StructureMap.MVC5 以使用身份的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26240873/
http://docs.structuremap.net/似乎有使用已弃用成员的非常古老的示例。 有什么地方可以找到最新的 StructureMap doco 吗? 最佳答案 我似乎在以下位置找到了一
我似乎无法弄清楚如何将对象定义为单例并为构造函数定义两个参数。 我可以做/或 .. 只是不能同时做。 例如。 (这不起作用)... ForRequestedType() .TheDefault
有没有办法确定在 StructureMap 中是否配置了特定类型? 如果在 StructureMap 中没有专门配置,我想返回一个泛型类型。 最佳答案 在 v2.6 你想要: IContainer.M
我想配置结构图以使用工厂类创建服务。工厂本身有一个需要填充的依赖项。目前我的注册表类中有以下内容: For().Singleton().Use(() => new DoStuffWebServ
我正在尝试使用 StructureMap 2.6.1 使用基于约定的注册一次注册我的所有存储库。见下面的代码: x.Scan(s => { s.TheCallingAssembly();
在 StructureMap 中你可以声明一个 Forward声明,这将允许注册单个具体实例,以由来自 StructureMap documentation 的多个接口(interface)解析: v
在 StructureMap 2 中,我有这样的事情: For().HybridHttpOrThreadLocalScoped().Use(); 使用 Structure Map 3 时,我应该使用以
如何将 StructureMap 与 OpenRasta 一起使用?我可以使用它来代替内部依赖解析器,还是只能将它与内置 DI 结合使用(即用于我自己的应用程序的依赖项)? 谢谢 最佳答案 Struc
我刚刚开始使用 StructureMap,之前使用过 Spring.Net。我喜欢 DefaultConventionScanner 以及扫描程序集和使用约定优于配置来查找类的能力。但是似乎有一个限制
我有一个通用接口(interface) public interface IDomainDataRepository { T[] GetAll(); } 有一个通用的实现 public cla
我正在尝试从 Structuremap 2.6.4.1 迁移到 3.1.4.143,但无法弄清楚如何处理 HybridHttpOrThreadLocalScoped。我能找到的所有 SO Q/A 似乎
所以我有一种情况,我想注册 n 个特定查找类型的映射。即: x.For().Add(); x.For().Add(); 我想让 SM 将它们的可枚举(或数组)注入(inject)到类的构造函数中: p
以下哪种语法被认为是最佳实践? For().LifecycleIs(new HybridLifecycle()).Use(); For().LifecycleIs(Lifecycles.GetLife
StructureMap 有没有办法用一行或约定来做这种重复映射? For>().Use(); For>().Use(); For>().Use(); For>().U
似乎 NLog 不能对 GetCurrentClassLogger() 使用反射,即使我的 MVC 3 应用程序部署在 中完全信任 IIS7 环境。我使用的是 StructureMap 2.6.1,问
StructureMap 定义了一个接口(interface) IBootStrapper,我看到很多人在他们的 Bootstrap 类中实现了这个接口(interface)。 但是我找不到任何可以说
我们将 Caliburn.Micro 用于我们的 MVVM 框架,将 StructureMap 用于我们的 IoC 容器,并将 MediatR 用于我们的调解器实现。这一切都工作正常,除了注册 Med
使用方法DecorateAllWith用 DynamicProxy 装饰所有实例都实现了一个接口(interface)? 例如: public class ApplicationServiceInte
在 autoFac 中,我可以注册一个接口(interface)的多个实现。当 autofac 实例化我的对象时,所有实例都传递给构造函数。 来自 autofac 的文档:here For examp
我有一个 Repository 的基类。在一个特定的项目中,我有几个这个基类的实现。例如 PersonRepository : Repository EmployerRepository : Repo
我是一名优秀的程序员,十分优秀!