Например, в моем проекте у меня есть пользовательское связующее, которое делает что-то вроде этого (я использую его с ViewModel, как показано здесь ):
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);
}
}
Теперь, каковы преимущества и почему речь идет о IoC? Это помогает мне избавиться от связующего звена в модели от проблем с разрешением сущностей, сохраняя разделение проблем. Что значит id и как мы получаем сущность, делегируется для resolver. Это помогает повторно использовать один и тот же IModelBinder для любого объекта. Единственное, что мне нужно сделать, это предоставить преобразователь модели, если (как показано выше) я хочу искать по имени, а не по идентификатору.
IoC здесь (я использую Service Locator, но в любом случае) помогает найти правильный распознаватель и создать его экземпляр. Обратите внимание, что распознаватели принимают IRepository, который контейнер IoC передает автоматически.
По вашим конкретным вопросам, конечно, мы должны использовать IoC с IModelBinder, но не без - но вы, вероятно, также можете использовать IoC для создания экземпляра IModelBinder - это позволит избежать необходимости использовать ServiceLocator; но я не знаю, как перехватить MVC, создавая связующее, и, честно говоря, мне все равно, так как я доволен Locator.
Что касается KiGG, я обычно предлагаю не полагаться на примеры проектов, таких как NerdDinner или Oxite (ничего не могу сказать о KiGG), как если бы они были ссылками на «хороший дизайн» - насколько я вижу, они обычно демонстрируют технические аспекты (то есть особенности), не очень хороший дизайн.