2012-04-19 20 views
8

Ho una classe controller che si occupa del comando doppio clic e, a sua volta, chiama un metodo che fa apparire una finestra all'utente. Qualcosa di simile:Il tipo corrente è un'interfaccia e non può essere costruito. Ti manca una mappatura dei tipi?

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

Nella linea sopra di esso genera un errore dicendo: Il tipo corrente, PopupCommand.IPopupDataHandler, è un'interfaccia e non può essere costruita. Ti manca una mappatura dei tipi?

Ho aggiornato la DLL che conteneva un metodo per container.GetService(), prima che funzionasse correttamente.

Ho provato a cercare su google, ma i problemi simili sono più legati a Unity e dubito che il mio problema sia collegato a Unity.

+0

Leggere la [guida per la modifica] (http://stackoverflow.com/editing-help#code). –

+1

Qual è il tipo di 'contenitore'? –

+0

Inoltre, quali argomenti 'PopupCommand' prende nel suo costruttore. L'eccezione contiene qualche informazione in più? –

risposta

1

Fondamentalmente il compilatore indica che si sta tentando di creare un'istanza di un'interfaccia.

container.GetService<PopupCommand>() probabilmente si riporta un'interfaccia denominata PopupCommand.IPopupDataHandler, probabilmente avete bisogno di gettare al tipo è necessario o modificare il tipo di un oggetto, si dovrebbe anche verificare i vincoli del metodo - si potrebbe mancare il vincolo new .

0

Prova Addin DefaultController Factory per la registrazione del controller. tre fasi: Fase 1 1.Add una classe DefaultControllerFactory nel progetto

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

Step 2: Registrare in classe Bootstrap nel metodo BuildUnityContainer

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

Fase 3: e registrarlo nella Global .asax File

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

E terminato. Potrebbe essere questo che funzionerà per voi ... Happy Coding.

Problemi correlati