현재 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);
}
은 사람이하기 전에이로 실행 했습니까? 어떻게 그걸 극복 했니?
감사합니다.
그러면 느슨한 커플 링 규칙을 위반하지 않았습니까? 어떤 이유로 든 내 구체적인 메소드의 이름을 변경하거나 변경해야하는 경우, 즉 Record가 RecordDifferent가되는 경우 IRecord를 구현하는 RecordDifferent를 가질 수 있으며 IRecord의 모든 경우에 RecordDifferent를 주입하도록 DI를 변경합니다. –
나는 인터페이스가 아닌 모델 컨테이너와 상속에 클래스를 사용하기를 권합니다. 기본적으로 DI는 액션에 전달 된 객체를 만드는 데 사용되지 않습니다. 데이터 컨테이너가 아닌 실제 논리에만 DI를 사용합니다. – Novakov
처음에는 무엇을 의미하는지 이해하지 못했지만이 프로젝트를 조금 진행하면서 이제는 단순 데이터 컨테이너를 "분리"하려고한다는 것을 깨달았습니다. 데이터베이스 테이블을 매핑하는 POOCO 객체에는 아무런 동작이 없으므로 인터페이스를 사용할 이유가 없으며 팩터 리를 사용하여 인스턴스화 할 수도 없습니다. 내가 이해할 수있는 문제는 디커플링이 실제로 데이터 속성이 아닌 동작이있는 객체에 사용되어야한다는 것입니다. –