5

현재 Ninject를 DI로 사용하는 MVC 3 프로젝트에서 작업 중이며, 비즈니스 객체는 별도의 어셈블리에 저장됩니다. 컨트롤러 매개 변수에 문제가 발생했습니다. CRUD 작업을 다시 게시 할 때 "인터페이스의 인스턴스를 만들 수 없습니다."오류가 발생합니다. 인터페이스의 인스턴스를 만들 수 없다는 것을 알고 있지만이 문제를 해결할 수있는 유일한 방법은 사용자 정의 모델 바인더를 사용하고 FormCollection을 전달하는 것입니다. 이것은 정말 지저분 해 보입니다. 가능한 한 많은 유형의 코드를 프로젝트에서 지키고 싶습니다. 따라서 모든 곳의 인터페이스와 DI의 Ninject가 콘크리트를 인터페이 스합니다. 사용자 정의 모델 바인딩은 지저분 해 보일뿐만 아니라 DataAnnotations도 잃지 않습니까?MVC 3 인터페이스를 전달하는 엔티티

내가 무엇을 설명하는 일부 코드 :

public ActionResult Create() 
{ 
    // I'm thinking of using a factory pattern for this part 
    var objectToCreate = new ConcereteType(); 
    return (objectToEdit); 
} 

[HttpPost] 
public ActionResult Create(IRecord record) 
{ 
    // check model and pass to repository 
    if (ModelState.IsValue) 
    { 
     _repository.Create(record); 
     return View(); 
    } 

    return View(record); 
} 

은 사람이하기 전에이로 실행 했습니까? 어떻게 그걸 극복 했니?

감사합니다.

답변

3

컨트롤러에 전달 된 데이터는 단순히 값의 소유자입니다. 어떤 논리도 없어야하므로 분리 할 것이 없습니다. 대신 인터페이스의 구체적인 유형 (예 : 기록)를 사용할 수 있습니다 (IRecord)

+1

그러면 느슨한 커플 링 규칙을 위반하지 않았습니까? 어떤 이유로 든 내 구체적인 메소드의 이름을 변경하거나 변경해야하는 경우, 즉 Record가 RecordDifferent가되는 경우 IRecord를 구현하는 RecordDifferent를 가질 수 있으며 IRecord의 모든 경우에 RecordDifferent를 주입하도록 DI를 변경합니다. –

+1

나는 인터페이스가 아닌 모델 컨테이너와 상속에 클래스를 사용하기를 권합니다. 기본적으로 DI는 액션에 전달 된 객체를 만드는 데 사용되지 않습니다. 데이터 컨테이너가 아닌 실제 논리에만 DI를 사용합니다. – Novakov

+0

처음에는 무엇을 의미하는지 이해하지 못했지만이 프로젝트를 조금 진행하면서 이제는 단순 데이터 컨테이너를 "분리"하려고한다는 것을 깨달았습니다. 데이터베이스 테이블을 매핑하는 POOCO 객체에는 아무런 동작이 없으므로 인터페이스를 사용할 이유가 없으며 팩터 리를 사용하여 인스턴스화 할 수도 없습니다. 내가 이해할 수있는 문제는 디커플링이 실제로 데이터 속성이 아닌 동작이있는 객체에 사용되어야한다는 것입니다. –

6

하지만이 사용자 정의 모델 바인더를

사용자 정의 모델 바인더를 사용하는 것입니다 주위에 내가 할 수있는 유일한 방법처럼 보인다 가는 올바른 방법입니다. 그런데 도메인 모델이나 인터페이스가 아닌 작업 인수로 뷰 모델을 사용해야합니다.

맞춤 모델 바인딩이 지저분 해 보일뿐만 아니라 내 DataAnnotations도 손실되지 않을까요?

나는 왜 사용자 정의 모델 바인더가 물건을 지저분해질 것이라고 생각하는지 모르겠습니다. 저에게 그것은 매핑 논리를 재사용 가능한 클래스로 분리하는 좋은 방법입니다. 그리고, 당신은 DataAnnotations을 잃지 않을 것입니다. 사용자 정의 모델 바인더가 리턴하는 구체적인 인스턴스에서 완벽하게 작동합니다.

+1

+1 다음은 몇 가지 요점에 대한 설명입니다. http://stackoverflow.com/questions/2899680/how-to-use-ninject-or-other-di-ioc-container-with-the-model-binder- in-asp-ne/2902871 # 2902871 –

+0

감사합니다. 이런 종류의 솔루션을 사용하여 존재하는 실용적인 사례를 알고 계십니까? –

+0

@ PaulAldred-Bann http://msdn.microsoft.com/en-us/magazine/hh781022.aspx – fordareh

2

나는 똑같은 실수를했다. Ninject는 생성자에 매개 변수를 삽입하지만 Index Controller 작업에 매개 변수를 추가했습니다.

은 다음과 같아야합니다

public class HomeController : Controller 
{ 
    private IRecord _record; 

    public HomeController(IRecord record) 
    { 
     _record = record; 
    } 

    public ActionResult Index() 
    { 
     ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application. " + 
          _record .HelloWorld(); 

     return View(); 
    } 
} 

만들기 감각을?

+2

고마워, 나는 똑같은 실수를 저질 렀다. –