2009-10-02 6 views
0

Alors que Scott Hanselman a réalisé une excellente démonstration de l'utilisation de IModelBinder dans « IPrincipal (User) ModelBinder in ASP.NET MVC for easier testing » il se sentait obligé de faire ce commentaire plutôt défensif:IModelBinder ou IOC dans ASP.NET MVC?

Oui, je me rends compte que je pouvais utiliser un conteneur IoC pour cela aussi.

voulait-il dire qu'il aurait pu utiliser du CIO au lieu de IModelBinder ou est-il dire que nous devrions utiliser IModelBinder avec du CIO? Avec la compréhension que beaucoup, beaucoup de choses peuvent être faites avec un langage de programmation à usage général (maintenant je deviens défensive) ce qui est réellement fait dans des scénarios du monde réel? Par exemple, un projet comme KiGG ne semble pas utiliser IModelBinder du tout.

Répondre

1

Par exemple, dans mon projet j'ai un liant personnalisé qui fait quelque chose comme ça (je l'utilise avec ViewModel comme montré here):

public interface IEntityResolver 
{ 
    object Find(string id); 
} 

public class PrimaryKeyResolver<T> where T: Entity 
{ 
    public PrimaryKeyResolver(IRepository<T> repository) {} 
    public object Find(string id) 
    { 
     return repository.Get(new Guid(id)); 
    } 
} 

public class NameResolver<T> where T: NamedEntity 
{ 
    public NameResolver(IRepository<T> repository) {} 
    public object Find(string id) 
    { 
     return repository.Find(new { Name = id }); 
    } 
} 

public class MyBinder: IModelBinder 
{ 
    public override object BindModel() 
    { 
     var id = ... //get id from context 
     var resolverType = typeof(IResolver<>).MakeGenericInterface(typeof(bindingContext.ModelType)); 
     var resolver = ServiceLocator.Current.GetInstance(resolverType); 
     return resolver.Find(id); 
    } 
} 

Maintenant, quels sont les avantages et pourquoi il est à peu près IoC? Cela m'aide à garder mon modèle de classeur exempt de problèmes de résolution d'entité, en préservant la séparation des préoccupations. Qu'est-ce que id signifie et comment nous obtenons l'entité est déléguée au résolveur. Cela permet de réutiliser le même IModelBinder pour n'importe quelle entité. La seule chose que je dois faire est de fournir le résolveur de modèle si (comme montré ci-dessus) je veux rechercher par nom, pas par id. IoC ici (j'utilise Service Locator mais de toute façon) aide à trouver le résolveur approprié et à l'instancier. Notez que resolvers accepte IRepository, que le conteneur IoC transmet automatiquement.

À propos de vos questions spécifiques, bien sûr, nous devrions utiliser IoC avec IModelBinder, non sans - mais vous pouvez probablement utiliser aussi IoC instancier IModelBinder - cela évitera la nécessité d'utiliser ServiceLocator; mais je ne sais pas comment intercepter MVC en créant le classeur, et franchement je m'en fiche puisque je suis content de Locator. En ce qui concerne KiGG, je suggère généralement de ne pas me fier à des exemples de projets tels que NerdDinner ou Oxite (je ne peux rien dire sur KiGG) comme s'ils étaient des références de «bon design» - pour autant que je vois qu'ils démontrent habituellement aspects techniques (caractéristiques), pas bon design.

+0

Recommandez-vous des projets MVC avec code source éducatif? – rasx

+0

Ils sont tous bons et éducatifs, mais ils enseignent MVC, pas de design. Pour moi personnellement, le blog de Jimmy Bogard était un grand aperçu des bonnes techniques: http://www.lostechies.com/blogs/jimmy_bogard/ (il est co-auteur de MVC In Action qui utilise CodeCampServer comme exemple de source, donc vous pouvez y regarder pas l'exemple parfait je dirais mais toujours). – queen3

0

Je viens d'ajouter ceci au codeplex http://mvcunity.codeplex.com/ qui pourrait aider. J'ai aussi ajouté un exemple d'application, laissez-moi savoir si vous avez des questions.