2012-04-19 8 views
8

Ich habe eine Controller-Klasse, die sich um den Doppelklick-Befehl kümmert und wiederum eine Methode aufruft, die dem Benutzer ein Fenster öffnet. Etwas wie:Der aktuelle Typ ist eine Schnittstelle und kann nicht konstruiert werden. Vermissen Sie ein Typ-Mapping?

var popup = container.GetService<PopupCommand>(); 

In der oberen Zeile einen Fehler wirft sagen: Der aktuelle Typ, PopupCommand.IPopupDataHandler, ist eine Schnittstelle und kann nicht aufgebaut werden. Vermissen Sie ein Typ-Mapping?

Ich aktualisierte die DLL, die eine Methode für container.GetService() enthielt, bevor es früher ordnungsgemäß funktionierte.

Ich habe versucht, in Google zu suchen, aber die Probleme ähneln eher mit Unity, und ich bezweifle, ob mein Problem irgendwo mit Unity verwandt ist.

+0

Lesen Sie die [Hilfe bearbeiten] (http://stackoverflow.com/editing-help#code). –

+1

Was ist der Typ von "Container"? –

+0

Welche Argumente nimmt 'PopupCommand' auch in seinem Konstruktor an? Enthält die Ausnahme einige weitere Informationen? –

Antwort

1

Grundsätzlich sagt der Compiler, dass Sie versuchen, eine Schnittstelle zu instanziieren.

container.GetService<PopupCommand>() bringt Sie wahrscheinlich eine Schnittstelle namens PopupCommand.IPopupDataHandler zurück, werden Sie wahrscheinlich es um die Art werfen müssen Sie brauchen oder den Typ eines Objekts ändern, sollten Sie auch die Zwänge des Verfahrens überprüfen - es die new Einschränkung könnte fehlt .

0

Probieren Sie Addin DefaultController Factory zum Registrieren Ihres Controllers aus. Drei Schritte: Schritt 1 1.Add eine Klasse DefaultControllerFactory in Ihrem Projekt

public class ControllerFactory :DefaultControllerFactory 
    { 
     protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
     { 
      try 
      { 
       if (controllerType == null) 
        throw new ArgumentNullException("controllerType"); 

       if (!typeof(IController).IsAssignableFrom(controllerType)) 
        throw new ArgumentException(string.Format(
         "Type requested is not a controller: {0}", 
         controllerType.Name), 
         "controllerType"); 

       return MvcUnityContainer.Container.Resolve(controllerType) as IController; 
      } 
      catch 
      { 
       return null; 
      } 

     } 
     public static class MvcUnityContainer 
     { 
      public static UnityContainer Container { get; set; } 
     } 
    } 

Schritt 2: es in Bootstrap Klasse registriert in BuildUnityContainer Methode

private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 

     // register all your components with the container here 
     // it is NOT necessary to register your controllers 

     // e.g. container.RegisterType<ITestService, TestService>();  
     //RegisterTypes(container); 
     container = new UnityContainer(); 
     container.RegisterType<IProductRepository, ProductRepository>(); 


     UnityInterceptionExample.Models.ControllerFactory.MvcUnityContainer.Container = container; 
     return container; 
    } 

Schritt 3: Und es in The Global Register .asax Datei

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
      AuthConfig.RegisterAuth(); 
      Bootstrapper.Initialise(); 
      ControllerBuilder.Current.SetControllerFactory(typeof(ControllerFactory)); 
     } 

Und finished. Vielleicht funktioniert das für Sie ... Happy Coding.

Verwandte Themen