C# 4.0 如何为asp.net MVC 5配置StructureMap

C# 4.0 如何为asp.net MVC 5配置StructureMap,c#-4.0,asp.net-mvc-4,dependency-injection,structuremap,asp.net-mvc-5,C# 4.0,Asp.net Mvc 4,Dependency Injection,Structuremap,Asp.net Mvc 5,我在犯错误。我的设置类似于asp.NETMVC4 没有为此对象定义无参数构造函数。描述:安 执行当前网站时发生未处理的异常 要求请查看堆栈跟踪以了解有关堆栈的更多信息 错误及其在代码中的起源 异常详细信息:System.MissingMethodException:未为此对象定义无参数构造函数 最终发现实际异常“尝试获取HomeController类型的实例时发生激活错误,密钥”“” 将服务类注入主控制器时出错,以下步骤对我有效: 在Visual Studio 2013 RTM中创建新的ASP.

我在犯错误。我的设置类似于asp.NETMVC4

没有为此对象定义无参数构造函数。描述:安 执行当前网站时发生未处理的异常 要求请查看堆栈跟踪以了解有关堆栈的更多信息 错误及其在代码中的起源

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

最终发现实际异常“尝试获取HomeController类型的实例时发生激活错误,密钥”“”


将服务类注入主控制器时出错,以下步骤对我有效:

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

    Install-Package StructureMap.MVC4
    
  • 创建新接口:

    public interface IDependency
    {
        string SayHello();
    }
    
    public class ConcreteDepenedency: IDependency
    {
        public string SayHello()
        {
            return "Hello World";
        }
    }
    
  • 实现此接口:

    public interface IDependency
    {
        string SayHello();
    }
    
    public class ConcreteDepenedency: IDependency
    {
        public string SayHello()
        {
            return "Hello World";
        }
    }
    
  • 让HomeController使用此界面:

    public class HomeController : Controller
    {
        private readonly IDependency dependency;
        public HomeController(IDependency dependency)
        {
            this.dependency = dependency;
        }
    
        public ActionResult Index()
        {
            return Content(this.dependency.SayHello());
        }
    }
    
  • ~/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;
            }
        }
    }
    
    使用StructureMap;
    使用WebApplication1.控制器;
    命名空间WebApplication1.DependencyResolution{
    公共静态类IoC{
    公共静态IContainer初始化(){
    ObjectFactory.Initialize(x=>
    {
    x、 For().Use();
    });
    返回ObjectFactory.Container;
    }
    }
    }
    
  • 使用Ctrl+F5运行应用程序

  • ConcreteDependency
    已成功注入
    HomeController
  • StructureMap(2.6.4.1)与ASP.NET MVC 5兼容,升级后无需更改任何内容

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

    这是一份你必须遵守的所有规则的清单

    PS:升级后,我一直在学习Rick Anderson的教程(他说你应该在升级前学习),但不管怎样,它还是奏效了


    希望能有所帮助。

    感谢您的回复,最终找到了问题所在。 在我的服务类中,我引用了一个应用程序设置,但没有在web.config文件中定义它,因为structuremap无法插入我的服务类的实例

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

    我在这里详细介绍了如何使用最新的StructureMap for MVC 5软件包实现此功能:

    这与我之前发布的ASP.NET MVC 3中所需的内容没有多大区别:


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

    看起来您正在尝试使用与ASP.NET MVC 5不兼容的StructureMap版本。您似乎试图安装根据旧版本的ASP.NET MVC编译的StructureMap NuGet。您使用的是哪个版本的NuGet?请使用此示例工作正常,但当我尝试注入服务类时,我遇到以下错误“尝试获取HomeController类型的实例时发生激活错误,键“””请使用它,这对于MVC5来说是一个更好的impl。简单明了。Darin Dimitrov示例运行良好,但当我尝试向存储库注入服务类时,我遇到了以下错误:在尝试获取HomeController类型的实例时发生了激活错误,键“”ToString(CultureInfo.InvariantCulture)实现了什么<代码>应用程序设置是一个<代码>字符串。ToString(IFormatProvider)记录了要执行的操作。