Как правильно получить доступ к хранилищу данных в пользовательских моделях Binder? - PullRequest
1 голос
/ 12 апреля 2010

Как правильно реализовать доступ к данным в моих пользовательских папках-моделях?

Как и в контроллерах, я использую IContentRepository, а затем заставляю его создавать экземпляр своего реализующего класса в конструкторе. Таким образом, у меня все готово для включения IoC (DI) на более позднем этапе.

Теперь мне нужно что-то похожее в модели переплета. Мне нужно сделать несколько просмотров БД в связывателе. Я думаю сделать это так же, как я это делаю в контроллерах, но я открыт для предложений.

Это фрагмент одного из моих контроллеров, так что вы можете представить, как я это делаю в них:

        public class WidgetZoneController : BaseController
        {
// BaseController has IContentRepository ContentRepository field
            public WidgetZoneController() : this(new XmlWidgetZoneRepository())
            {
            }

            public WidgetZoneController(IContentRepository repository)
            {
                ContentRepository = repository;
            }
    ...

Ответы [ 2 ]

0 голосов
/ 20 апреля 2011

Вы можете использовать инжекцию конструктора в свой класс связывания модели, а также наследовать от DefaultModelBinder.

public class MyModelBinder : DefaultModelBinder
{
    IContentRepository ContentRepository;

    public MyModelBinder(IContentRepository contentRepository)
    {
        this.ContentRepository = contentRepository;
    }

При использовании пользовательских связывателей моделей вы регистрируете их в Application_Start () следующим образом:

protected void Application_Start()
{
    System.Web.Mvc.ModelBinders.Binders.Add(
           typeof(MyModel), new MyModelBinder(contentRepository)
    );

Теперь, когда вы используете IoC, вам нужно помнить о времени жизни ваших объектов. Когда вы используете IoC с контроллерами, они существуют для каждого веб-запроса. Поэтому, если вы добавляете репозиторий, любые подключения к данным или сеансы OR / M будут существовать только в течение этого короткого времени.

При использовании связывателя моделей это в основном долгоживущий синглтон (Application_Start ()). Поэтому убедитесь, что ваш репозиторий работает в обоих случаях.

0 голосов
/ 12 апреля 2010

Поскольку связыватель обычно связывает сущность, вам не нужен определенный репозиторий, такой как IContentRepository, действительно, IRepository<T> будет хорошо для получения сущности.

Чтобы создать экземпляр IRipository, вы можете использовать что-то вроде этого:

var repositoryType = typeof (IRepository<>).MakeGenericType(entityType);

Я предлагаю вам взглянуть на реализацию связки сущностей CodeCampServer здесь:

http://code.google.com/p/codecampserver/source/browse/trunk#trunk/src/UI/Binders/Entities

...