【问题标题】:How to configure StructureMap for asp.net MVC 5如何为 asp.net MVC 5 配置 StructureMap
【发布时间】:2013-10-28 21:39:33
【问题描述】:

我遇到了错误。我设置它类似于 asp.net mvc 4。

没有为此对象定义无参数构造函数。说明:一个 当前 web 执行过程中发生未处理的异常 要求。请查看堆栈跟踪以获取有关 错误及其源自代码的位置。

异常详细信息:System.MissingMethodException:没有为此对象定义无参数构造函数。

终于找到实际异常“尝试获取HomeController类型的实例时发生激活错误,键“””

将服务类注入主控制器时发生错误

【问题讨论】:

  • 您似乎正在尝试使用与 ASP.NET MVC 5 不兼容的 StructureMap 版本。您似乎试图安装针对旧版本 ASP 编译的 StructureMap NuGet。网络 MVC。您使用的是哪个版本的 NuGet?

标签: c#-4.0 asp.net-mvc-4 dependency-injection structuremap asp.net-mvc-5


【解决方案1】:

以下步骤对我有用:

  1. 在 Visual Studio 2013 RTM 中创建新的 ASP.NET MVC 5 应用程序
  2. 安装StructureMap.MVC4 NuGet:

    Install-Package StructureMap.MVC4
    
  3. 创建一个新界面:

    public interface IDependency
    {
        string SayHello();
    }
    
  4. 实现这个接口:

    public class ConcreteDepenedency: IDependency
    {
        public string SayHello()
        {
            return "Hello World";
        }
    }
    
  5. 让 HomeController 使用这个接口:

    public class HomeController : Controller
    {
        private readonly IDependency dependency;
        public HomeController(IDependency dependency)
        {
            this.dependency = dependency;
        }
    
        public ActionResult Index()
        {
            return Content(this.dependency.SayHello());
        }
    }
    
  6. ~/DependencyResolution/Ioc.cs 中配置您的容器:

    using StructureMap;
    using WebApplication1.Controllers;
    
    namespace WebApplication1.DependencyResolution {
    
        public static class IoC {
    
            public static IContainer Initialize() {
    
                ObjectFactory.Initialize(x =>
                {
                    x.For<IDependency>().Use<ConcreteDepenedency>();
                });
    
                return ObjectFactory.Container;
            }
        }
    }
    
  7. 使用 Ctrl+F5

  8. 运行您的应用程序
  9. ConcreteDependency 成功注入HomeController

【讨论】:

  • 此示例运行良好,但是当我尝试注入服务类时,出现以下错误“尝试获取 HomeController 类型的实例时发生激活错误,键“””
  • 请使用nuget.org/packages/StructureMap.MVC5,它是MVC5的更好实现
  • 谢谢哥们。直截了当。
【解决方案2】:

我有一个详细的演练,展示了如何使用最新的 StructureMap for MVC 5 包在这里工作: http://ardalis.com/resolving-dependencies-in-asp.net-mvc-5-with-structuremap

这与我之前发布的 ASP.NET MVC 3 中所需的内容并没有太大的不同: http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3

基本上,您只需安装正确的 NuGet 包,修改您的控制器以接受依赖项,并将您的接口连接到您在 IoC.cs 中的实现。如果您遵循 StructureMap 的默认约定,您可以让这种连接自动发生在许多类型中。

【讨论】:

    【解决方案3】:

    StructureMap (2.6.4.1) 与 ASP.NET MVC 5 兼容,升级后无需更改任何内容。

    不过,升级过程并不像您想象的那么简单。

    如果你必须关注,这里是所有steps 的列表。

    PS:我在升级后遵循了 Rick Anderson 的教程(他说你应该在之前这样做),但它仍然有效。

    希望对你有帮助。

    【讨论】:

    • Darin Dimitrov 示例工作正常,但是当我尝试使用存储库注入服务类时,我收到此错误:尝试获取 HomeController 类型的实例时发生激活错误,键“”
    【解决方案4】:

    谢谢大家的回复终于找到问题了。 在我的服务类中,我引用了一个应用设置,但没有在 web.config 文件中定义它,因为该结构图无法注入我的服务类的实例。

    private readonly string _path =
                ConfigurationManager.AppSettings["vp"].ToString(CultureInfo.InvariantCulture);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多