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.
Recommandez-vous des projets MVC avec code source éducatif? – rasx
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