1

Asp.Net MVC 3에서 종속성 주입을 위해 IoC 컨테이너를 사용하고 있으며 컨트롤러에 Action 메서드를 작성하기 전까지 모든 것이 완벽하게 보입니다. 액션 메소드 내에서 엔티티/모델 객체를 만드는 가장 좋은 방법은 무엇입니까? 가끔 모델은 생성자를 통해 컨트롤러에 주입되는 특정 저장소 또는 서비스에서 검색되지만 시스템의 다른 많은 모델 객체와는 다릅니다.IoC를 사용하여 작업 메서드에서 모델 개체 해결

+0

자세한 정보를 제공해 주시겠습니까? 일부 모델 객체가 리포지토리 또는 서비스에서 제공되지 않는 경우, 어디에서 온 것입니까? 새 모델 객체를 만드는 경우 모델 팩토리/빌더를 의존성으로 주입 할 수 있습니다. – MattDavey

+0

실제로 여러 단계가있는 컨트롤러가 있으며 대부분의 경우 모든 액션이 다른 모델과 다른 뷰를 생성하고 모델을보기 위해 설정됩니다. HtmlHelper는 데이터를 받아들이는 폼을 표시하기 위해 확장 메소드를 사용하기 위해 모델로 설정된 빈 객체를 필요로합니다.이 뷰의 viewmodel은 특정 객체 유형, 예를 들어'SiteSettings' 클래스의 특정 속성을 가지고 있습니다. 어떻게 ViewModel과 그 의존성을 Action 메소드 내에서 해결할 지 모르겠습니다. –

+0

당신이 묻는 원래 질문은 당신이 물어 보려고했던 질문과 다릅니다라고 생각합니다. 이 질문은 IOC 컨테이너를 사용하여 작업 내에서 개체를 확인하는 방법에 관한 것입니다. "ASP.NET MVC에서 마법사를 만들려면 어떻게해야합니까?"와 같은 실질적인 질문이 들리며 올바른 대답은 작업 방법에서 IOC 컨테이너를 사용하는 것과 관련이 없을 것이라고 생각합니다. 새로운 질문을하면 더 나은 해결책을 얻을 수 있습니다. –

답변

3

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> 주입을 처리 할 수 ​​있어야합니다.

+0

정상적인 생성자 삽입 만 사용하면 어떨까요? Func 에 대해서는 아무 것도 없습니다. . . –

+0

나는 동의한다. 그러나 질문 제목에는 "실제 목표를 달성하기위한 더 나은 방법이 있다고 생각합니다."라고 IoC를 사용하여 액션 모델에서 모델 개체를 확인하는 *이 나와 있습니다. –

+4

현실 세계 상황은 6 가지 행동을 취할 수 있으며 그 중 하나만이 'IFooService'를 필요로하며 'IFooService'를 만드는 것이 비용이 많이 든다. 이 상황에서 우리는 액션에'IFooService'의 해결을 미루고 그것을 필요로하지 않는 액션에 대해서는 해결되지 않도록 할 수 있습니다. 즉, 아마'IFooService'에 다음과 같이 시작하는 디자인 문제가 있다는 것을 의미합니다. –

3

작업 인수를 해결하기 위해 DI 컨테이너를 사용하지 마십시오. 이것이 model binder이 ASP.NET MVC에서 의도 한 것입니다. 그런데 당신의 행동은 어떤 도메인 모델을 인수로 취해야 만합니다.> 뷰 모델 만 가져야합니다. 뷰 모델은 특정 뷰의 요구 사항을 충족하도록 특별히 정의 된 클래스입니다.

그래서 특정 사례의 경우 작업 인수의 인스턴스화 및 바인딩을 담당 할 사용자 정의 모델 바인더를 작성할 수 있습니다. ASP.NET MVC 3에서는 모델 바인더 자체의 인스턴스 생성과 관련하여 DI 프레임 워크를 사용하여이 모델 바인더에 종속성을 주입하는 데 사용할 수있는 dependency resolver을 사용할 수 있습니다.

+0

모델이나 뷰 모델, 나는 게시 된 데이터 나 매개 변수에 대해 이야기하는 것이 아니므로 기본 CRUD 컨트롤러의 Create 메서드와 같이 뷰로 전달해야하는 데이터를 어떻게 생성 할 것인가? 따라서 View 모델을 직접 생성 할 수 있습니까? –

+0

@Threecoins, 나는 당신이 무엇을 요구하고 있는지 잘 모르겠습니다. 뷰에 전달하는 데이터는 뷰 모델의 형태로 제공됩니다. 뷰 모델은이 뷰에 필요한 정보를 정의하고 포함시키는 클래스입니다. 컨트롤러 동작은 리포지토리에 쿼리하여 도메인 모델을 가져온 다음이 도메인 모델을 뷰 모델에 매핑하고 뷰 모델을 뷰에 전달합니다. 어쩌면 문제를 좀 더 잘 설명 할 수있는 코드를 보여줄 수 있습니까? –

+0

@DarinDimitrov Autofac과 같이 모델 바인더를 구현해야한다면 멋질 것입니다. –

관련 문제