![](/img/trans.png)
[英]Autofac - Make sure that the controller has a parameterless public constructor
[英]Parameterless Controller Constructor Autofac
我遇到一個MVC4項目的問題,令人沮喪地在一台計算機上工作得很好(VS 2012),但另一方面卻沒有(VS 2010)。
(我希望沖突的VS版本不是問題,但該項目最初來自VS2010計算機,我在2012年做了一些工作,現在我正試圖把它放回到2010年。)
我得到一個“確保控制器有一個無參數的公共構造函數”錯誤,但我認為我的控制器有默認值:
public class HomeController : AuthorizedControllerBase
{
public ViewResult Index()
{
return View();
}
}
拋出錯誤的代碼在我的ControllerFactory中:
public class ControllerFactory : DefaultControllerFactory
{
private readonly IStateProvider _sessionStateProvider;
public ControllerFactory(IStateProvider aStateProvider)
{
_sessionStateProvider = aStateProvider;
}
public override IController CreateController
(System.Web.Routing.RequestContext requestContext, string controllerName)
{
IController controller = base.CreateController(requestContext, controllerName);
if (controller is BaseController)
{
var baseController = (BaseController)controller; // ***This line***
baseController.SessionData = _sessionStateProvider;
}
return controller;
}
}
我看到了一個與此類似的問題,其中接口實現者沒有公共構造函數,但同樣,我認為我的確有默認構造函數:
public class SessionStateProvider : IStateProvider
{
public object this[string key]
{
get
{
return HttpContext.Current.Session[key];
}
set
{
HttpContext.Current.Session[key] = value;
}
}
public void Remove(string key)
{
HttpContext.Current.Session.Remove(key);
}
}
基於對其他問題和堆棧跟蹤的回答,我正在研究Autofac問題。 我剛剛做了Install-Package Autofac
並且在項目中有最新的(3.0.2), Install-Package Autofac
看起來像這樣:
InnerException: Autofac.Core.DependencyResolutionException
Message=An exception was thrown while executing a resolve operation. See the InnerException for details. ---> Common Language Runtime detected an invalid program. (See inner exception for details.)
Source=Autofac
StackTrace:
at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType)
at Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(Type serviceType)
at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)
InnerException: System.InvalidProgramException
Message=Common Language Runtime detected an invalid program.
Source=Autofac
StackTrace:
at Autofac.Core.Activators.Reflection.ConstructorParameterBinding..ctor(ConstructorInfo ci, IEnumerable`1 availableParameters, IComponentContext context)
at Autofac.Core.Activators.Reflection.ReflectionActivator.<>c__DisplayClass5.<GetConstructorBindings>b__4(ConstructorInfo ci)
at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Registration.ExternalRegistrySource.<>c__DisplayClass8.<RegistrationsFor>b__3(IComponentContext c, IEnumerable`1 p)
at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable`1 parameters)
at Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration registration, IEnumerable`1 parameters)
即使我確實注冊了IStateProvider,也會發生這種情況: builder.Register(context => new SessionStateProvider()).As<IStateProvider>();
在ContainerBuilder.BuildContainer()
。 在Global.asax中,我還注冊了ControllerFactory:
protected void Application_Start()
{
Container = ContainerBuilder.BuildContainer();
var autofacDependencyResolver = new AutofacDependencyResolver(Container);
DependencyResolver.SetResolver(autofacDependencyResolver);
ControllerBuilder.Current.SetControllerFactory(new ControllerFactory(Container.Resolve<IStateProvider>()));
Application_Start_MVC();
}
我不確定下一個可能的步驟是什么嘗試解決這個問題(我已經超出了解析Autofac堆棧跟蹤的深度),我會感激任何幫助。
嗨,我不在VS 2010測試,因為我沒有它。 但在我的VS 2013工作正常。
public static class DependencyInjection
{
public static void Init()
{
// Create the container builder.
var builder = new ContainerBuilder();
//Register controllers
builder.RegisterControllers(Assembly.GetExecutingAssembly());
// Register other dependencies.
builder.RegisterType<SessionStateProvider>().As<IStateProvider>().InstancePerHttpRequest();
// Build the container.
var container = builder.Build();
//Configure ASP.NET MVC the dependency resolver
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
public class SessionStateProvider:IStateProvider
{
public object this[string key]
{
get
{
return HttpContext.Current.Session[key];
}
set
{
HttpContext.Current.Session[key] = value;
}
}
public void Remove(string key)
{
HttpContext.Current.Session.Remove(key);
}
}
public interface IStateProvider
{
object this[string key] { get; set; }
void Remove(string key);
}
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
DependencyInjection.Init();
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
public abstract class BaseController : Controller
{
protected IStateProvider SessionStateProvider { get; private set; }
public BaseController()
{
SessionStateProvider = DependencyResolver.Current.GetService<IStateProvider>();
}
}
public class HomeController : BaseController
{
public ActionResult Index()
{
SessionStateProvider["1"] = 2;
return View();
}
}
Autofac - > https://www.nuget.org/packages/Autofac.Mvc4/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.