Asp.Net MVC 3에서 종속성 주입을 위해 IoC 컨테이너를 사용하고 있으며 컨트롤러에 Action 메서드를 작성하기 전까지 모든 것이 완벽하게 보입니다. 액션 메소드 내에서 엔티티/모델 객체를 만드는 가장 좋은 방법은 무엇입니까? 가끔 모델은 생성자를 통해 컨트롤러에 주입되는 특정 저장소 또는 서비스에서 검색되지만 시스템의 다른 많은 모델 객체와는 다릅니다.IoC를 사용하여 작업 메서드에서 모델 개체 해결
답변
IOC 컨테이너는 구성 요소를 만드는 데 가장 잘 사용됩니다. 모델 객체를 만드는 데 사용해서는 안됩니다. 예를 들어,이 좋은입니다 :
public ActionResult SignUp(string username, string password)
{
var user = new User(); // Your model object
user.Username = username; //...
_repository.Save(user);
return Redirect(...);
}
모델 객체는 종속성 자체를 가지고 가면 안된다, 그래서 그것은 IOC 컨테이너에서 해결 될 필요가 없습니다. 동일한 모델을 볼 적용
public ActionResult Show(int userId)
{
var user = _repository.Load<User>(userId);
var model = new ShowUserModel(user);
return View(model);
}
작성 후 모델/뷰 모델이어야 효과적으로 읽기 전용이므로 컨트롤러를 통해 전달되어야 필요가있는 정보 - 이는 주입 종속성을지지한다. 당신은 정말, 정말 작업에서 동적 구성 요소를 만들 필요 않은 경우
, 당신은 이런 식으로 작업을 수행 할 수 있습니다
class HomeController : Controller
{
readonly Func<IFooService> _fooServiceFactory;
public HomeController(Func<IFooService> fooServiceFactory)
{
_fooServiceFactory = fooServiceFactory;
}
public ActionResult SomeAction()
{
var service = _fooServiceFactory(); // Resolves IFooService dynamically
service.DoStuff();
}
}
어떤 점잖은 IOC 컨테이너는 Func<T>
주입을 처리 할 수 있어야합니다.
정상적인 생성자 삽입 만 사용하면 어떨까요? Func
나는 동의한다. 그러나 질문 제목에는 "실제 목표를 달성하기위한 더 나은 방법이 있다고 생각합니다."라고 IoC를 사용하여 액션 모델에서 모델 개체를 확인하는 *이 나와 있습니다. –
현실 세계 상황은 6 가지 행동을 취할 수 있으며 그 중 하나만이 'IFooService'를 필요로하며 'IFooService'를 만드는 것이 비용이 많이 든다. 이 상황에서 우리는 액션에'IFooService'의 해결을 미루고 그것을 필요로하지 않는 액션에 대해서는 해결되지 않도록 할 수 있습니다. 즉, 아마'IFooService'에 다음과 같이 시작하는 디자인 문제가 있다는 것을 의미합니다. –
작업 인수를 해결하기 위해 DI 컨테이너를 사용하지 마십시오. 이것이 model binder이 ASP.NET MVC에서 의도 한 것입니다. 그런데 당신의 행동은 어떤 도메인 모델을 인수로 취해야 만합니다.> 뷰 모델 만 가져야합니다. 뷰 모델은 특정 뷰의 요구 사항을 충족하도록 특별히 정의 된 클래스입니다.
그래서 특정 사례의 경우 작업 인수의 인스턴스화 및 바인딩을 담당 할 사용자 정의 모델 바인더를 작성할 수 있습니다. ASP.NET MVC 3에서는 모델 바인더 자체의 인스턴스 생성과 관련하여 DI 프레임 워크를 사용하여이 모델 바인더에 종속성을 주입하는 데 사용할 수있는 dependency resolver을 사용할 수 있습니다.
모델이나 뷰 모델, 나는 게시 된 데이터 나 매개 변수에 대해 이야기하는 것이 아니므로 기본 CRUD 컨트롤러의 Create 메서드와 같이 뷰로 전달해야하는 데이터를 어떻게 생성 할 것인가? 따라서 View 모델을 직접 생성 할 수 있습니까? –
@Threecoins, 나는 당신이 무엇을 요구하고 있는지 잘 모르겠습니다. 뷰에 전달하는 데이터는 뷰 모델의 형태로 제공됩니다. 뷰 모델은이 뷰에 필요한 정보를 정의하고 포함시키는 클래스입니다. 컨트롤러 동작은 리포지토리에 쿼리하여 도메인 모델을 가져온 다음이 도메인 모델을 뷰 모델에 매핑하고 뷰 모델을 뷰에 전달합니다. 어쩌면 문제를 좀 더 잘 설명 할 수있는 코드를 보여줄 수 있습니까? –
@DarinDimitrov Autofac과 같이 모델 바인더를 구현해야한다면 멋질 것입니다. –
- 1. IoC를 사용하여 동적으로로드 된 유형 해결
- 2. IoC를 사용한 개체 트리 초기화
- 3. IoC를 사용하여 컨트롤러 테스트
- 4. IoC를 사용할 때 개체 처리를 어떻게 관리합니까?
- 5. Yii - 다른 작업 메서드에서 작업 메서드 호출
- 6. 메서드에서 매개 변수로 개체 전달
- 7. doInBackground 메서드에서 작업 시작
- 8. 개체 모델 직렬화/역 직렬화
- 9. Ninject IOC를 사용하여 공장 교체하기
- 10. IoC를 사용하여 인터페이스 유효성 검사
- 11. IoC를 언제 사용합니까?
- 12. Javascript 개체 : 메서드에서 개체 변수에 액세스
- 13. WriteToParcel 메서드에서 Parcel에 개체 쓰기
- 14. as3의 메서드에서 개체 가져 오기
- 15. 메서드에서 개체 소유권 명명 규칙
- 16. SL4 RIA에서 연결된 개체 해결
- 17. 모델 메서드에서 장고 역방향 조회
- 18. 작업 공간의 모든 모델 작업
- 19. 작업 서명에서 개체 바인더 선택
- 20. 고객 개체 모델
- 21. CSV와 개체 모델 매핑
- 22. asp.net POST 작업 메서드에서 nhibernate 엔터티를 업데이트하는 적절한 방법은 무엇입니까?
- 23. 모델 개체 C#
- 24. 개체 모델 디자인 선택
- 25. 여러 유형이 될 수있는 사람/근로자를위한 개체 모델 ("작업")
- 26. SharePoint-Outlook 개체 모델, API
- 27. IOC를 사용하여 뷰 엔진을 해결할 수 있습니까?
- 28. IOC를 사용하여 단위 및 통합 테스트 구성
- 29. IoC를 사용하여 인스턴스를 구별하기 위해 이름 사용
- 30. 클래스 메서드에서 IB 개체/컨트롤 액세스
자세한 정보를 제공해 주시겠습니까? 일부 모델 객체가 리포지토리 또는 서비스에서 제공되지 않는 경우, 어디에서 온 것입니까? 새 모델 객체를 만드는 경우 모델 팩토리/빌더를 의존성으로 주입 할 수 있습니다. – MattDavey
실제로 여러 단계가있는 컨트롤러가 있으며 대부분의 경우 모든 액션이 다른 모델과 다른 뷰를 생성하고 모델을보기 위해 설정됩니다. HtmlHelper는 데이터를 받아들이는 폼을 표시하기 위해 확장 메소드를 사용하기 위해 모델로 설정된 빈 객체를 필요로합니다.이 뷰의 viewmodel은 특정 객체 유형, 예를 들어'SiteSettings' 클래스의 특정 속성을 가지고 있습니다. 어떻게 ViewModel과 그 의존성을 Action 메소드 내에서 해결할 지 모르겠습니다. –
당신이 묻는 원래 질문은 당신이 물어 보려고했던 질문과 다릅니다라고 생각합니다. 이 질문은 IOC 컨테이너를 사용하여 작업 내에서 개체를 확인하는 방법에 관한 것입니다. "ASP.NET MVC에서 마법사를 만들려면 어떻게해야합니까?"와 같은 실질적인 질문이 들리며 올바른 대답은 작업 방법에서 IOC 컨테이너를 사용하는 것과 관련이 없을 것이라고 생각합니다. 새로운 질문을하면 더 나은 해결책을 얻을 수 있습니다. –