首先通过NuGet尝试StructureMap和MVC3

时间:2011-03-16 00:08:49

标签: asp.net-mvc asp.net-mvc-3 entity-framework code-first structuremap

我正在尝试如何为ASP.NET MVC3配置StructureMap我已经使用了NuGet,我注意到它创建了一个名为StructuremapMVC的cs文件的App_Start文件夹,所以我检查它并注意到它是一样的代码但已简化,将在Global.asax上的App_Start部分手动编写...

这是我来自IoC Class的代码

public static class IoC
    {
        public static IContainer Initialize()
        {
            ObjectFactory.Initialize(x =>
                        {
                            x.Scan(scan =>
                                    {
                                        scan.TheCallingAssembly();
                                        scan.WithDefaultConventions();
                                        scan.AddAllTypesOf<IController>();
                                    });
                            x.For<OpcionDB>().Use(() => new DatabaseFactory().Get());
                        });
            return ObjectFactory.Container;
        }
    }

我的问题是为什么当我在控制器上注入一些IoC时会出现异常(我使用这种模式:Entity Framework 4 CTP 4 / CTP 5 Generic Repository Pattern and Unit Testable):

        private readonly IAsambleaRepository _aRep;
        private readonly IUnitOfWork _uOw;

        public AsambleaController(IAsambleaRepository aRep, IUnitOfWork uOw)
        {
            _aRep = aRep;
            this._uOw = uOw;
        }

        public ActionResult List(string period)
        {
            var rs = _aRep.ByPeriodo(period).ToList<Asamblea>();

            return View();
        }

异常显示:

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

5 个答案:

答案 0 :(得分:4)

要处理控制器构造函数中的参数,必须配置依赖项解析器。

检查以下帖子,了解如何使用ASP.NET MVC3连接StructureMap:

http://stevesmithblog.com/blog/how-do-i-use-structuremap-with-asp-net-mvc-3/

http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with-mvc3-please-read-this/

答案 1 :(得分:3)

您收到该错误是因为您没有设置StructureMap来解析构造AsambleaController所需的依赖关系,所以它试图找到一个没有参数的构造函数。

所以你需要做的是为IAsambleaRepositoryIUnitOfWork设置StructureMap。

在旁注中,我会说IUnitOfWork应该依赖于您的存储库而不是您的控制器......您的控制器不应该知道工作单元。

答案 2 :(得分:2)

如果您按照Repository上的帖子进行操作,则需要将这些配置添加到IoC.cs文件中:

x.For<IUnitOfWork>().HttpContextScoped().Use<UnitOfWork>();
x.For<IDatabaseFacroey>().HttpContextScoped().Use<DatabaseFactory>();
x.For<IAsambleaRepository >().HttpContextScoped().Use<AsambleaRepository>();

调用:scan.TheCallingAssembly();只会看看MVC项目。如果您的解决方案中的服务和存储库位于不同的项目中,则需要添加如下:

scan.Assembly("Your.Assembly");

答案 3 :(得分:2)

StructureMap.MVC3的NuGet安装在DependencyResolution文件夹中安装一个名为SmDependencyResolver.cs的文件。您会注意到其中的GetService方法有一个try ... catch,如果发生异常,它只返回null。这可以抑制异常的细节,以便您最终看到有关“无参数构造函数”的错误消息。

要获取有关原始异常的更多信息,可以在该catch子句中添加一些内容以吐出原始异常的详细信息 - 例如Debug.WriteLine:

    public object GetService(Type serviceType)
    {
        if (serviceType == null) return null;
        try
        {
            return serviceType.IsAbstract || serviceType.IsInterface
                     ? _container.TryGetInstance(serviceType)
                     : _container.GetInstance(serviceType);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
            return null;
        }
    }

这可以帮助您找出问题的根源。

答案 4 :(得分:1)

在debug中运行,你可能会得到一个StructureMap IOC分辨率错误。

而不是获得真正的分辨率错误,而是显示此消息。在某些地方,MVC管道吞噬了真正的错误。