Asp.net-Mvc

結構圖不適用於 MVC4

  • February 5, 2021

StructureMap在 MVC2/3 中使用過很多次,沒有任何顧慮,但我想在 MVC4 中處理 IoC 是不同的。當我用於StructureMap在 MVC4 中處理 IoC 時,出現以下異常:

沒有為此對象定義無參數建構子

為什麼?我在Google中沒有找到任何正確的結果,除了這個: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>();
   }
}

我的錯誤是:

沒有為此對象定義無參數建構子。說明:執行目前 Web 請求期間發生未處理的異常。請查看堆棧跟踪以獲取有關錯誤及其源自程式碼的位置的更多資訊。

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

源錯誤:

在執行目前 Web 請求期間生成了未處理的異常。可以使用下面的異常堆棧跟踪來辨識有關異常起源和位置的資訊。

堆棧跟踪:

$$ 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控制器名稱) +74

System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& 控制器, IControllerFactory& 工廠) +196 System.Web.Mvc.<>c__DisplayClass6.b__2() +49 System.Web.Mvc.<>c__DisplayClassb 1 func)+124 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback 回調,對象狀態)+98`1.<ProcessInApplicationTrust>b__a() +13 System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22

System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`

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&lt;IControllerActivator&gt;().Use&lt;StructureMapControllerActivator&gt;();

然後享受它。祝你好運

引用自:https://stackoverflow.com/questions/9557497