Пример реализации IModelBinderProvider для внедрения в конструктор ModelBinder в MVC 3 - PullRequest
7 голосов
/ 08 декабря 2010

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

Итак.Вот что у меня есть: 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, но очень непонятно, как подключить это.( в этом посте )

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

Ответы [ 2 ]

7 голосов
/ 09 декабря 2010

Я столкнулся с той же ситуацией при кодировании моего приложения 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 (Unity в моем случае):

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

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

5 голосов
/ 09 декабря 2010

Вам нужно написать свой 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());
...