首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StructureMap IoC in Application_Start

StructureMap IoC in Application_Start
EN

Stack Overflow用户
提问于 2016-03-02 12:39:05
回答 1查看 1.8K关注 0票数 2

我无法让StructureMap向MvcApplication的Global.asax.cs文件的构造函数中注入一个值。我创建了一个全新的、干净的项目,并使用StructureMap.MVC5包在DependencyResolution子文件夹中生成必要的结构。

我要被注射的课程很简单:

代码语言:javascript
复制
namespace SMTest.Models {
    public interface ITestSM
    {
        int OnePlusTwo();
    }
    public class TestSM : ITestSM
    {
        public int OnePlusTwo()
        {
            return 1 + 2;
        }
    } }

IoC.cs是:

代码语言:javascript
复制
namespace SMTest.DependencyResolution {
    using StructureMap;

    public static class IoC {
        public static IContainer Initialize() {
            return new Container(c => c.AddRegistry<DefaultRegistry>());
        }
    }
}

StructuremapMvc.cs包含:

代码语言:javascript
复制
    public static void Start() {
        IContainer container = IoC.Initialize();
        StructureMapDependencyScope = new StructureMapDependencyScope(container);
        DependencyResolver.SetResolver(StructureMapDependencyScope);
        DynamicModuleUtility.RegisterModule(typeof(StructureMapScopeModule));
    }

DefaultRegistry.cs包含:

代码语言:javascript
复制
    public DefaultRegistry() {
        Scan(
            scan => {
                scan.TheCallingAssembly();
                scan.WithDefaultConventions();
                scan.With(new ControllerConvention());
            });

        For<ITestSM>().Singleton().Use<TestSM>();
    }

我可以轻松地将它插入到HomeController中:

代码语言:javascript
复制
public class HomeController : Controller
{
    private ITestSM _testsm;
    public HomeController(ITestSM testsm):base()
    {
        _testsm = testsm; 
    }

    public ActionResult Index()
    {
        return View();
    }

但是,当我尝试在Global.asax.cs中这样做时:

代码语言:javascript
复制
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:

代码语言:javascript
复制
[assembly: PreApplicationStartMethod(typeof(StructuremapMvc), "Start")]
[assembly: ApplicationShutdownMethod(typeof(StructuremapMvc), "End")]

有什么想法吗?

编辑:i能够显式地将它注入Global.asax.cs:

代码语言:javascript
复制
    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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()方法中配置容器。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35747494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档