asp.net-mvc - Structuremap 不适用于 MVC4

标签 asp.net-mvc asp.net-mvc-3 inversion-of-control structuremap asp.net-mvc-4

我用过StructureMap在 MVC2/3 中很多次都没有任何问题,但我猜处理 IoC 在 MVC4 中是不同的。 当我使用StructureMap时在 MVC4 中处理 IoC 时出现以下异常:

没有为此对象定义无参数构造函数

为什么? 我在谷歌中没有找到任何正确的结果,除了:IoC Not Working In MVC4 这些是我的 IoC 类:

public static class IoC {
    public static IContainer Initialize() {
        ObjectFactory.Initialize(x =>
                    {
                        x.Scan(scan =>
                        {
                            //scan.Assembly("DLL.Core");
                            scan.Assembly("DLL.CMS");
                            scan.TheCallingAssembly();
                            scan.WithDefaultConventions();
                        });
                        x.For<IDbContext>().Use<ModelEntities>();
                        x.For(typeof(IRepository<>)).Use(typeof(Repository<>));
                        x.For<IHttpControllerActivator>();
                        x.For<IController>();
                    });

        return ObjectFactory.Container;
    }

SmDependencyResolver 是:

    public class SmDependencyResolver : IDependencyResolver
{
    private readonly IContainer _container;

    public SmDependencyResolver(IContainer container)
    {
        _container = container;
    }

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

            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances(serviceType).Cast<object>();
    }
}

我的错误是:

No parameterless constructor defined for this object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

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

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[MissingMethodException: No parameterless constructor defined for this object.] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67

[InvalidOperationException: An error occurred when trying to create a controller of type 'Parsian.Web.Areas.Dashboard.Controllers.MemberController'. Make sure that the controller has a parameterless public constructor.]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +196 System.Web.Mvc.<>c__DisplayClass6.b__2() +49 System.Web.Mvc.<>c__DisplayClassb1.<ProcessInApplicationTrust>b__a() +13 System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22<br/> System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func1 func) +124 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8862676 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

感谢您的正确回答。

最佳答案

哎呀,我找到了一个紧急解决方案:)尝试从IControllerActivator实现一个类

public class StructureMapControllerActivator : IControllerActivator
{
   private IContainer _container;
    
   public StructureMapControllerActivator(IContainer container)
   {
       _container = container;
   }
    
   public IController Create(RequestContext requestContext, Type controllerType)
   {
       return _container.GetInstance(controllerType) as IController;
   }
}

然后将其注册到IoC类:

 x.For<IControllerActivator>().Use<StructureMapControllerActivator>();

然后就可以享受它了。 祝你好运

关于asp.net-mvc - Structuremap 不适用于 MVC4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9557497/

相关文章:

c# - Autofac 属性注入(inject) System.ComponentModel.DataAnnotations ValidationAttribute

c# - MVC : is there a definitive answer as to where business logic belongs?

javascript - 使用 Javascript 将参数从 URL 传递到隐藏表单字段 (Gridview)

javascript - 如何在 MVC 3 的 HTML 表格中使用幻灯片切换?

c# - 结构图 - 如何在特定层中注册特定类型

configuration - 为什么要在没有配置的情况下进行依赖注入(inject)?

asp.net-mvc - 我可以在 MVC3 中向 HTML.ActionLink 添加一个类吗

c# - 如何以 PDF 格式呈现 ASP.NET MVC View

asp.net-mvc - Ninject 与 MembershipProvider |角色提供者

asp.net-mvc - 处理用户重新提交删除操作的正确方法?