2010-12-08 1 views
7

Мне нужно подключить мой пользовательский ModelBinder до контейнера DI в MVC 3, но я не могу заставить его работать.Пример реализации IModelBinderProvider для встраивания конструктора ModelBinder в MVC 3

So. Это то, что у меня есть: ModelBinder с инжектируемой конструктором.

public class ProductModelBinder : IModelBinder{ 
    public ProductModelBinder(IProductService productService){/*sets field*/} 
    // the rest don't matter. It works. 
} 

Мой связующий работает отлично, если я добавляю это так:

ModelBinders.Binders.Add(typeof(Product), 
    new ProductModelBinder(IoC.Resolve<IProductService>())); 

Но это старый способ сделать это, и я не хочу этого.

Что мне нужно, это помощь в том, как подключить этот модельный блок до зарегистрированного IDependencyResolver.

Согласно Брэду Уилсону, секрет использует реализацию IModelBinderProvider, но очень неясно, как это подключить. (in this post)

У кого-нибудь есть пример?

+1

IModelBinderProvider будет вашей собственной реализацией. Просто так случилось, что я написал сообщение в блоге об этой вещи. Http://buildstarted.com/2010/12/02/modelbinderproviders-automatic-binding-your-models-is-easy-as-pie/ Надеюсь, это поможет – Buildstarted 2010-12-08 20:45:35

+0

Да , это хорошо работает. Я просто заменяю материал CreateInstance() на var instance = (IModelBinder) DependencyResolver.Current.GetService (type); Спасибо! . – 2010-12-08 21:06:59

ответ

7

я столкнулся с такой же ситуацией, когда кодирование мое приложение MVC 3. Я в конечном итоге с чем-то вроде этого:

public class ModelBinderProvider : IModelBinderProvider 
{ 
    private static Type IfSubClassOrSame(Type subClass, Type baseClass, Type binder) 
    { 
     if (subClass == baseClass || subClass.IsSubclassOf(baseClass)) 
      return binder; 
     else 
      return null; 
    } 

    public IModelBinder GetBinder(Type modelType) 
    { 
     var binderType = 
      IfSubClassOrSame(modelType, typeof(xCommand), typeof(xCommandBinder)) ?? 
      IfSubClassOrSame(modelType, typeof(yCommand), typeof(yCommandBinder)) ?? null; 

     return binderType != null ? (IModelBinder) IoC.Resolve(binderType) : null; 
    } 
} 

Тогда я зарегистрировал это в моем IoC контейнер (Единство в моем случае):

_container.RegisterType<IModelBinderProvider, ModelBinderProvider>("ModelBinderProvider", singleton()); 

Это работает для меня.

5

Вы должны написать свой собственный IModelBinderProvider и зарегистрировать его в ModelBinderProviders.BinderProviders коллекции:

public class YourModelBinderProvider : IModelBinderProvider { 
    public IModelBinder GetBinder(Type modelType) { 
     if(modelType == typeof(Product)) { 
      return new ProductModelBinder(...); 
     } 
     return null; 
    } 
} 

В Global.asax:

ModelBinderProviders.BinderProviders.Add(new YourModelBinderProvider()); 
Смежные вопросы