1

Как должным образом реализовать доступ к данным в моих настраиваемых связующих объектах?Каков подходящий способ доступа к хранилищу данных в пользовательских привязках модели?

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

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

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

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

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

ответ

0

Поскольку связующее обычно связывают сущность, вам не нужен конкретный репозиторий, как 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

0

Вы можете использовать впрыск конструктора к своему классу связующего класса модели, а также наследовать от 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 будут существовать только в течение этого короткого времени.

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