結構圖不適用於 MVC4
我
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
感謝您的正確答案。
哎呀。我找到了一個緊急解決方案:) 嘗試從
IControllerActivatorpublic 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>();然後享受它。祝你好運