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에이를 등록 : IOC의를 사용하는 경우

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

지금, 당신이 마음에 개체의 수명을 유지해야합니다. 컨트롤러와 함께 IoC를 사용하면 웹 요청별로 존재합니다. 따라서 저장소를 삽입하면 짧은 시간 동안 만 모든 데이터 연결 또는 OR/M 세션이 존재하게됩니다.

모델 바인더는 기본적으로 수명이 긴 싱글 톤 (Application_Start())입니다. 따라서 저장소가 두 경우 모두 작동하는지 확인하십시오.