私はMVC4プロジェクトで問題が発生しています。これは、1台のコンピュータ(VS 2012)でうまく動作しますが、もう一方(VS 2010)ではうまく動作しません。Parameterless ControllerコンストラクタAutofac
(対立するVSバージョンは問題ではないが、プロジェクトはもともとVS2010コンピュータから来たもので、私は2012年に作業をしたが、今は2010年に戻そうとしている)
public class HomeController : AuthorizedControllerBase
{
public ViewResult Index()
{
return View();
}
}
エラーがスローコードは私のControllerFactoryである:
私はエラーが、私は私のコントローラはデフォルトの1を持っていると思います「コントローラは、パラメータなしのパブリックコンストラクタを持っていることを確認してください」を取得
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コンストラクタを持っていたところ
は、私がこれに似た質問を見ましたが、やはり、私は私はデフォルトの持っているんだと思う。他の質問への回答やスタックトレースに基づいて
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);
}
}
、私はをオートファックの問題を探しています。私はちょうどInstall-Package Autofac
を行なったし、プロジェクト内の(3.0.2)の最新のを持っており、スタックトレースは次のようになります。ContainerBuilder.BuildContainer()
でbuilder.Register(context => new SessionStateProvider()).As<IStateProvider>();
:
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登録していていても発生します。 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のスタックトレースを解析し、私の深さから抜け出す道だ)これを解決しようとするためのものであるかわからないんだけど、と私どんな助けにも感謝しています。
VS2010は問題ないのVisual Studioの原因となるので、.NET 4.5と.NET 4.0が、vs2012フレームワークのバージョンの違いが付属しています。 vs2010マシンで.net 4.5をイントールしようとするか、2.6のような古いバージョンのAutofacを使って両方の環境で動作するかどうかを調べることができます。 – nemesv
'InvalidProgramException' - Autofacがリゾルバを作成しようとしているときに、.NET Frameworkのバグのようです。 –
@nemesv Microsoft Bclパッケージを追加して、4.0の4.5の機能のほとんどにアクセスできます。 (しかし、ソースコントロールを使用すると混乱を招くことに注意してください) –