我无法让StructureMap向MvcApplication的Global.asax.cs文件的构造函数中注入一个值。我创建了一个全新的、干净的项目,并使用StructureMap.MVC5包在DependencyResolution子文件夹中生成必要的结构。
我要被注射的课程很简单:
namespace SMTest.Models {
public interface ITestSM
{
int OnePlusTwo();
}
public class TestSM : ITestSM
{
public int OnePlusTwo()
{
return 1 + 2;
}
} }IoC.cs是:
namespace SMTest.DependencyResolution {
using StructureMap;
public static class IoC {
public static IContainer Initialize() {
return new Container(c => c.AddRegistry<DefaultRegistry>());
}
}
}StructuremapMvc.cs包含:
public static void Start() {
IContainer container = IoC.Initialize();
StructureMapDependencyScope = new StructureMapDependencyScope(container);
DependencyResolver.SetResolver(StructureMapDependencyScope);
DynamicModuleUtility.RegisterModule(typeof(StructureMapScopeModule));
}DefaultRegistry.cs包含:
public DefaultRegistry() {
Scan(
scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.With(new ControllerConvention());
});
For<ITestSM>().Singleton().Use<TestSM>();
}我可以轻松地将它插入到HomeController中:
public class HomeController : Controller
{
private ITestSM _testsm;
public HomeController(ITestSM testsm):base()
{
_testsm = testsm;
}
public ActionResult Index()
{
return View();
}但是,当我尝试在Global.asax.cs中这样做时:
public class MvcApplication : System.Web.HttpApplication
{
private ITestSM _testsm;
public MvcApplication(ITestSM testsm)
{
_testsm = testsm;
}
protected void Application_Start()
{...我得到了错误:编译器错误消息: CS7036:不存在与所需的形式参数'testsm‘相对应的参数
尽管IoC init在Application_Start之前触发,StructuremapMvc.cs:
[assembly: PreApplicationStartMethod(typeof(StructuremapMvc), "Start")]
[assembly: ApplicationShutdownMethod(typeof(StructuremapMvc), "End")]有什么想法吗?
编辑:i能够显式地将它注入Global.asax.cs:
protected void Application_EndRequest(object sender, System.EventArgs e)
{
if (!this.Request.Path.Contains("Content") && !this.Request.Path.Contains("Scripts") && !this.Request.Path.Contains("less"))
{
ISession currentSession = SMTest.App_StartStructuremapMvc.StructureMapDependencyScope.Container.GetInstance<ISession>();
currentSession.Flush();
currentSession.Close();
}
}但是,我在这里获得的会话不是注入控制器的会话,因此我正在刷新和关闭错误的会话,留下数据没有被提交给DB。
发布于 2016-03-04 02:45:03
不幸的是,不可能通过构造函数注入将依赖项注入到MvcApplication类中。这样做的唯一方法是,正如您所发现的,通过容器的静态实例(也称为Service模式)访问容器。
让我解释一下为什么会出现这种情况。
在设置容器之后,您可以调用以下行:DependencyResolver.SetResolver(StructureMapDependencyScope);
这一行设置了将您的IoC容器(在本例中为StructureMap)挂钩到ASP.NET MVC的依赖解析器。最终充当ASP.NET和您的StructureMap容器之间的接口。
当控制器被MVC框架实例化时,依赖关系将通过在DependencyResolver中配置的实例来解决。但是,在创建MvcApplication实例时,依赖关系不会通过DependencyResolver实例解决。通过DependencyResolver解析依赖关系的唯一实例类型是控制器。归根结底,这是ASP.NET MVC框架中的一个缺陷(已经在ASP.NET Core中得到了纠正)。
此外,在调用构造函数时甚至没有配置容器,而只在调用控制器后调用的Start()方法中配置容器。
https://stackoverflow.com/questions/35747494
复制相似问题