2014-11-05 1 views
0

프로젝트에 여러 개의 Web API 컨트롤러가 있습니다. 많은 중복 된 코드를 작성한 후, 아래 코드로 리팩터링했습니다.이 코드는 재사용 성이 높은 것으로 보입니다. 그러나 갑자기 오류가 Make sure that the controller has a parameterless public constructor, Ninject 컨트롤러 바인딩을 해결할 수없는 것으로 인해 것 같습니다. 나는 그들을 묶는 방법을 모르겠다.컨트롤러 해결 : "컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오."

내 코드 :

kernel.Bind<IController<OntvangstViewModel, long>>().To<OntvangstenController>(); 
kernel.Bind<BaseController<OntvangstViewModel, long>>().To<OntvangstenController>(); 

그러나 어느 쪽도 제대로 작동 다음 Ninject에 RegisterServices 방법에서

public interface IController<T, TK> 
{ 
    DataSourceResult Get(DataSourceRequest request); 
    T Get(TK id); 
    HttpResponseMessage Post(T model); 
    T Put(T model); 
    TK Delete(TK id); 
} 

public abstract class BaseController<T, TK> : ApiController, IController<T, TK> 
{ 
    private readonly IRepository<T, TK> repository; 

    public BaseController(IRepository<T, TK> repository) 
    { 
     this.repository = repository; 
    } 

    /* methods here */ 
} 

public class ReceiptsController : BaseController<ReceiptViewModel, long> 
{ 
    public ReceiptsController(IRepository<ReceiptViewModel, long> repository) : 
     base(repository) 
    { 
    } 
} 

, 나는 다음과 같은 시도했습니다. 구현 또는 상속이 잘못 되었습니까? 아니면 내가 다르게 묶어야합니까?

+1

이것을 확인하십시오 : http://stackoverflow.com/questions/24254189/webapi-make-sure-that-the-controller-has-a-parameterless-public-constructor –

+2

Hmmmmmmm .... 제 생각에는 먼저 이 [비디오] (https://skillsmatter.com/skillscasts/5688-orms-you-re-doing-it-wrong)를보십시오. 그런 다음 앱을 다시 작성하십시오. –

+0

화재 발견 이후 저장소가 왜 가장 좋은지에 대한 약 백만 건의 기사를 본 후 그 비디오는 매우 흥미로 웠습니다. 내가 집에 갈 때 나는 그것을 볼 것이다. –

답변

1

수일 동안 읽을 수있는 저장소와 관련하여 많은 논의가 있습니다. 난 당신의 코드를 더하게 지적 할 수있는 것은 이것이다 :

public class ReceiptsController : ApiController 
{ 
    public ReceiptsController() 
    { 
    } 

    public List<Receipt> Get() 
    { 
     List<Receipt> receipts = new List<Receipt>(); 
     using (var context = new DbContext()) 
     { 
      receipts = context.Receipts.ToList(); 
     } 

     return View(receipts); 
    } 
} 

당신은 저장소가 필요하지 않습니다. 그들은 실제로 혜택을주지 않습니다. 실제로 그들은 DbContext에서 많은 선을 제거합니다. 나의 예에서, 당신은 주입에 대해 전혀 걱정할 필요가 없다.

DbContext을 자세히 살펴보십시오.

using에 싸여 있습니다. 즉, 데이터베이스 연결을 사용하여 작업을 완료하거나 데이터베이스 트랜잭션이 오류를 발생 시키면 연결이 제대로 처리됩니다. 시나리오에서 발생하지 않는 것 - AFAIK.

두 번째로, 필자가 작성한 적은 작성 시간이 적기 때문에 작성 시간이 적습니다. 컨트롤러 클래스, 인터페이스, 저장소의 일반적인 구현, 저장소의 구체적인 구현. 그래서 내가 피할 수있는 4 가지 수업이 있습니다.

IMHO - 내 방식은 톤수가 적고 작성하는 코드가 적습니다. 안전한.

+0

저는 제대로 된 일을하는 데 "올바른 길"에 초점을 맞추어 왔습니다. 나는 그 일을 완전히 끝내기가 어려웠습니다. 후진 조치를 취한 후, 필자는 내 접근 방식이 실제로 프로젝트에 불필요하다는 것을 깨달았습니다. –

+1

위는 "올바른 방법"입니다. 의견으로 인한 것이 아니라 그것이하는 일 때문입니다. 요청 범위에 컨텍스트를 올바르게 처리합니다. 'DbContext'에서 유용한 함수를 노출합니다. 프로젝트에서해야 할 일을 생각할 때 먼저 사용하는 프레임 워크에 필요한 것이 무엇인지 생각하십시오. –

관련 문제