IModelBinder или IOC в ASP.NET MVC? - PullRequest
       21

IModelBinder или IOC в ASP.NET MVC?

0 голосов
/ 02 октября 2009

В то время как Скотт Хансельман провел отличную демонстрацию использования IModelBinder в « IPrincipal (User) ModelBinder в ASP.NET MVC для упрощения тестирования », он чувствовал себя вынужденным сделать этот довольно оборонительный комментарий:

Да, я понимаю, что мог бы также использовать контейнер IoC.

Он имел в виду, что мог бы использовать IOC вместо IModelBinder или он говорит, что мы должны использовать IModelBinder с IOC? С пониманием того, что многие, многие вещи можно сделать с помощью языка программирования общего назначения (теперь я защищаюсь), что на самом деле делается в реальных сценариях? Например, проект, подобный KiGG , вообще не использует IModelBinder.

Ответы [ 2 ]

1 голос
/ 02 октября 2009

Например, в моем проекте у меня есть пользовательское связующее, которое делает что-то вроде этого (я использую его с 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), как если бы они были ссылками на «хороший дизайн» - насколько я вижу, они обычно демонстрируют технические аспекты (то есть особенности), не очень хороший дизайн.

0 голосов
/ 17 января 2010

Я только что добавил это в кодовый комплекс http://mvcunity.codeplex.com/, который может помочь. Я также добавил пример приложения, дайте мне знать, если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...