Внедрение зависимостей внутри пользовательских связывателей и фильтров ASP.NET MVC - PullRequest
1 голос
/ 30 июня 2010

Это мой пользовательский код связывания модели для класса BaseContentObject:

public class BaseContentObjectCommonPropertiesBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }

        BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext);
        IContentRepository repository = new XmlContentRepository(obj.ContentType);

        // do something with the object and repository here...

        return obj;
    }
}

Я упустил некоторый код для ясности.

Именно эта линия меня интересует.

IContentRepository repository = new XmlContentRepository(obj.ContentType);

У меня все настроено для внедрения зависимости, и оно работает с моими контроллерами.Я использую Ninject 2. Каким-то образом мне нужно подключить DI внутри связывателя модели (и у меня аналогичная проблема с фильтрами действий MVC) - как в пользовательских связывателях, так и в фильтрах настраиваемых действий, мне иногда нужно получить доступ к хранилищуили службы, потому что мне нужен доступ к базе данных.

Что еще хуже, хранилище содержимого не исправлено, оно зависит от "obj.ContentType".

Все, что я нашел такfar указывает на документацию Ninject, но в вики приведены только самые простые примеры, и, похоже, она еще не обновлена ​​до версии 2.

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

В этом проекте утверждается, что он может вводить зависимости в ModelBinder http://mvcextensions.codeplex.com/. Это сделано Кази Манзуром Рашидом из Telerik.

0 голосов
/ 30 июня 2010

Если я правильно понял вопрос, вы хотите сделать это repository свойством, а затем в конструкторе вызвать метод Inject ядра Ninject с this в качестве параметра.

Если вы используете атрибут [Inject] для определения свойств, которые должны быть внедрены, используйте его для этого. Если вы используете автоматическое связывание, создайте Module, который автоматически связывает свойства типа IContentRepository с конструктором XmlContentRepository.

Теперь единственной проблемой, которую вам нужно решить, является передача ContentType в репозиторий, учитывая, что ваш конструктор не имеет к этому доступа. Возможно ContentType свойство на IContentRepository?

[Edit] Все это говорит, что я не согласен с аргументом, что вы, вероятно, должны найти подход, отличный от DI. Я просто объясняю, как это можно сделать, если вы действительно хотите.

...