Реализация пользовательского связывателя модели в MVC для разрешения типов из контейнера

Вкратце мой вопрос сводится к следующему:

Мне нужно реализовать настраиваемую привязку модели в MVC4, которая разрешает модели из локатора контейнера/сервиса, что угодно. Я реализовал следующий связыватель модели:

public class ServiceLocatorModelBinder : DefaultModelBinder
{
    private readonly IServiceLocator _serviceLocator;

    public ServiceLocatorModelBinder(IServiceLocator serviceLocator)
    {
        _serviceLocator = serviceLocator;
    }

    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var typeValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".ModelType");
        var type = Type.GetType(
            (string)typeValue.ConvertTo(typeof(string)),
            true
        );
        var model = _serviceLocator.GetInstance(modelType);
        bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
        return model;
    }
}

И теперь я хотел бы использовать это вместо DefaultModelBinder в mvc для разрешения всех моих моделей. Как мне это сделать?

Чтобы прояснить мою потребность в этом вообще (поскольку в целом считается лучшей практикой просто использовать конкретные простые классы для моделей/моделей представления), я экспериментирую с концепцией автоматического создания прокси вместо моей простой модели представления /poco в моем приложении, и поэтому у меня нет конкретного типа для привязки. Цель, которую я надеюсь достичь, состоит в том, чтобы взять шаблон сохранения моделей/моделей представлений простым и усилить его еще на один шаг, сделав невозможным добавление какой-либо логики к этим классам. Здесь мне нужен контейнер для разрешения типов моделей.


person Mitchell Lee    schedule 19.08.2012    source источник


Ответы (1)


Как мне это сделать?

Вы можете заменить привязку модели по умолчанию на свою собственную в Application_Start:

IServiceLocator sl = ...
ModelBinders.Binders.DefaultBinder = new ServiceLocatorModelBinder(sl);
person Darin Dimitrov    schedule 19.08.2012
comment
Ах, спасибо, это то, что я искал, я попробую, а затем отмечу это как ответ, если это сработает. Спасибо за быстрый ответ :) - person Mitchell Lee; 19.08.2012