2013-07-03 6 views
5

मुझे एक एमवीसी 4 प्रोजेक्ट में समस्याएं आ रही हैं जो निराशाजनक रूप से एक कंप्यूटर (वीएस 2012) पर ठीक काम करती है, लेकिन दूसरी (वीएस 2010) पर नहीं।पैरामीटर रहित नियंत्रक कन्स्ट्रक्टर ऑटोफैक

(मुझे उम्मीद है कि विरोधाभासी वीएस संस्करण समस्या नहीं हैं, लेकिन मूल रूप से प्रोजेक्ट वीएस -2010 कंप्यूटर से आया था, मैंने 2012 में कुछ काम किया था, और अब मैं इसे 2010 में वापस रखने की कोशिश कर रहा हूं।)

मैं एक त्रुटि "यकीन है कि नियंत्रक एक parameterless सार्वजनिक निर्माता है कि बनाओ" मिल लेकिन मुझे लगता है मेरी नियंत्रक डिफ़ॉल्ट से एक है कार्य करें:

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; 
    } 
} 

मैं कहाँ इंटरफ़ेस implementer कोई सार्वजनिक निर्माता था एक सवाल इस के समान देखा, लेकिन फिर से, मुझे लगता है कि मेरा डिफ़ॉल्ट एक है:

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); 
    } 
} 

अन्य सवालों के जवाब और स्टैकट्रेस आधार पर, मैं कर रहा हूँ ऑटोफैक समस्याओं में देख रहे हैं। ContainerBuilder.BuildContainer() में builder.Register(context => new SessionStateProvider()).As<IStateProvider>();: मैं बस Install-Package Autofac किया था और नवीनतम (3.0.2) परियोजना में है, और स्टैकट्रेस इस तरह दिखता है:

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 स्टैकट्रेस पार्स करने का हूँ) इस को हल करने की कोशिश कर रहे हैं के लिए नहीं कर रहा हूँ, और मैं किसी भी मदद की सराहना करते हैं।

+2

VS2010 समस्या नहीं दृश्य स्टूडियो के कारण .net 4.0 लेकिन .net 4.5 इसलिए ढांचा संस्करण अंतर के साथ vs2012 साथ आता है। आप vs2010 मशीन पर .NET 4.5 को इंटेल करने का प्रयास कर सकते हैं या आप 2.6 जैसे ऑटोफैक के पुराने संस्करण का उपयोग करने का प्रयास कर सकते हैं यह देखने के लिए कि यह दोनों वातावरण में काम करता है या नहीं। – nemesv

+1

'अवैधप्रोग्राम एक्सेप्शन' - एक .NET फ्रेमवर्क बग की तरह लगता है जब ऑटोफ़ैक एक रिज़ॉल्वर बनाने की कोशिश कर रहा है। –

+0

@nemesv आप 4.0 के तहत 4.5 में से अधिकांश सुविधाओं तक पहुंचने के लिए माइक्रोसॉफ्ट बीसीएल पैकेज जोड़ सकते हैं। (लेकिन देखें, स्रोत-नियंत्रण का उपयोग करते समय वे गड़बड़ कर सकते हैं) –

उत्तर

0

हाय मैं वीएस 2010 में इसका परीक्षण नहीं करता क्योंकि मेरे पास यह नहीं है। लेकिन मेरे वीएस 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/

संबंधित मुद्दे