First try StructureMap and MVC3 via NuGet

三世轮回 提交于 2019-12-04 07:10:26

You are getting that error because you haven't setup StructureMap to resolve the dependencies needed to contruct the AsambleaController so it tries to find a parameterless constructor which there isn't one.

So what you need to do is setup StructureMap for IAsambleaRepository and IUnitOfWork.

On a side note, I'd say that IUnitOfWork should be a dependency on your repository and not your controller... your controller shouldn't need to know about the unit of work.

To handle parameters in the controller's constructor, the dependency resolver must be configured.

Check the following post on how to wire up the StructureMap with ASP.NET MVC3:

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/

If you followed the post on Repository you will want to add these configurations to your IoC.cs File:

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

The call to: scan.TheCallingAssembly(); will only look at the MVC project. If you have your services and repositories in a different project in your solution you will need to add it like this:

scan.Assembly("Your.Assembly");

The NuGet installation of StructureMap.MVC3 installs a file called SmDependencyResolver.cs in the folder DependencyResolution. You'll notice that the GetService method in there has a try...catch that just returns null if an exception occurs. This can suppress the details of an exception so that you end up seeing the error message about "no parameterless constructor" instead.

To get more information about the original exception you can add something in that catch clause to spit out the original exception's details - for example the Debug.WriteLine here:

    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;
        }
    }

This may help you track down the source of the problem.

Run in debug, you're probably getting a StructureMap IOC resolution error.

Instead of getting the real resolution error you get displayed this message instead. Somewhere along the lines the MVC pipeline swallows the real error.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!