2009-12-08 11 views
1

Avec mon projet de compagnie, j'essaie d'apprendre à utiliser Turbine comme un conteneur DI.Le constructeur du contrôleur paramétré ne se fait jamais frapper

J'enregistrer l'unité comme locatorprovider en tant que tel:

static MvcApplication() 
{ 
    ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator()); 
} 

Mon référentiel utilisateur dispose d'un constructeur parameterless et je l'enregistrer en tant que tel:

public class UserRepositoryRegistration : IServiceRegistration 
{ 
    public void Register(IServiceLocator locator) 
    { 
     locator.Register<IUserRepository, UserRepository>(); 
    } 
} 

J'ai mon HomeController qui devrait accepter un IUserRepository

public class HomeController : Controller 
{ 
    private readonly IUserRepository userRepository; 

    public HomeController(IUserRepository repository) 
    { 
     userRepository = repository; 
    } 
} 

Si je laisse de côté le ct sans paramètre ou (comme dans l'extrait de code ci-dessus) Je reçois ce (full here):

 
Server Error in '/' Application. 
No parameterless constructor defined for this object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. 
[InvalidOperationException: An error occurred when trying to create a controller of type 'Boris.BeekProject.Guis.Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.] 

Donc, mon HomeController est obligé d'avoir un cteur de parless. Il semble que ce ne soit pas l'usine de contrôleur Unity qui instancie, mais plutôt la fabrique par défaut.

MISE À JOUR
Mon MVCApplication est héritant TurbineApplication et depuis le RouteRegistration est pris très bien je pense que le problème est ailleurs.

MISE À JOUR
Comme suggéré par Thomas Eyde Je voulais remplacer la méthode TurbineApplication.AutoComponent, mais vérifier l'Explorateur d'objets, je ne vois aucune référence à cette méthode. En outre, quand je regarde l'exemple de NerdDinner, il ne semble pas outrepasser cette méthode. Après avoir vérifié le online documentation about it j'ai échoué à obtenir le plus sage et en suivant le lien vers la documentation sur doing the registration manually me sert d'une page d'espace réservé. Quelqu'un peut-il me renseigner sur ce que je fais mal?

Ai-je raté quelque chose?

+1

En outre, tous les conseils sur le formatage de cette exception serait bien. J'ai posté un problème sur meta: http://meta.stackexchange.com/questions/32264/posting-a-stack-trace –

+0

Avez-vous hérité de la classe TurbineApplication à votre classe Global.asax MvcApplication? –

+0

@Magnus: Oui, il hérite de TurbineApplication. La chose étrange est que le IRouteRegistration est ramassé bien. –

Répondre

1

Votre construction de turbine ne supporte pas MVC2, dans lequel le ControllerFactory est modifié pour soutenir une paramètre supplémentaire pour la création de contrôleurs. Ceci explique pourquoi votre contrôleur n'est jamais instancié correctement. The breaking changes of MVC2 list this change.

Si vous êtes désireux d'utiliser MVC2 Beta (pour .NET4) pour votre développement, je vous suggère la nouvelle MVC2 (.NET4) bits I just released.

espoir que vous aide!

+0

Merci. Je n'ai pas eu le temps pour ce projet d'animal de compagnie ces derniers temps, mais la semaine prochaine j'aurai du temps à perdre je pense. Je vais certainement le vérifier alors. Merci :) –

+0

Pas de problème, Boris. Je comprends parfaitement. Une question, utilisez-vous Turbine avec MVC2 avec .NET4 ou .NET3.5? La raison que je demande est parce que je suis en train de compiler Turbine contre les bits MVC2 RC qui fonctionnent au-dessus de .NET3.5, ainsi vous pourriez bénéficier de cette mise à jour aussi bien. –

+0

Salut Javier, merci pour le soutien jusqu'à présent dans mes diverses questions :) Il est toujours plaine vieux 3.5;) –

1

Vous devez surcharger la TurbineApplication.AutoComponentSetup -method, quelque chose comme ceci:

protected override void AutoComponentSetup(IServiceLocator locator) 
{ 
    //Remove this if you want to skip all other previous registrations 
    base.AutoComponentSetup(locator); 

    AutoRegistration<IMyCustomInterface>((loc, type) => loc.Register<IMyCustomInterface>(type)); 
} 

Voir aussi Auto Registration for Components

+0

Ah oui, cela comble probablement l'écart :) Merci –

+0

après l'avoir testé, ça n'a pas fonctionné après tout. S'il vous plaît ref mettre à jour dans OP. –