2010-05-20 3 views
0

asp.net MVC 2를 사용하여 사이트를 개발하고 있습니다. IUser는 모델과 뷰 사이의 인터페이스로 사용되어보다 효과적으로 분리됩니다. 그러나, 물건은 여기에서 조금 지저분해진다. 사용자 로그인을 처리하는 컨트롤러에서 : 다음과 같습니다.ASP.NET MVC에서 모델과 뷰 간 인터페이스 사용

 IUserBll userBll = new UserBll(); 
     IUser newUser = new User(); 

     newUser.Username = answers[0].ToString(); 
     newUser.Email = answers[1].ToString(); 

     userBll.AddUser(newUser); 

사용자 클래스는 IUser를 구현하는 구체적인 클래스로 웹 프로젝트에 정의되어 있습니다. DAL에는 동일한 인터페이스를 구현하는 유사한 클래스가 있으며 데이터를 유지하는 데 사용됩니다. 그러나 userBll.AddUser가 호출 될 때 User 클래스의 클래스 (InvalidCastException)를 구현하더라도 User 유형의 newUser는 DAL User 클래스로 형변환 될 수 없습니다.

변환 연산자는 옵션 일 수도 있지만 DAL과 웹 사이의 의존 관계는 인터페이스 사용의 초기 목표에 위배됩니다.

제안 사항?

답변

0

의존성 주입을 처리하는 프로젝트가 있어야합니다. 이 프로젝트는 도메인 프로젝트 (IUserBll이 정의 된 곳)와 DLL 구현이있는 프로젝트를 참조합니다. 따라서 MVC 프로젝트는 의존성 주입 프로젝트를 참조하고 특정 인터페이스가 주어진다면 DI 구현을 요청하십시오.

StructureMap 또는 캐슬 윈저를 살펴보십시오. 컨트롤러가 더 같이 볼 수

//Global.asax 
    protected void Application_Start() 
    { 
     ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
    } 

    //Dependency Injection Project: 
    public class StructureMapControllerFactory : DefaultControllerFactory 
    { 
     protected override IController GetControllerInstance(Type controllerType) 
     { 
      if (controllerType != null) 
      { 
       return (IController)ObjectFactory.GetInstance(controllerType); 
      } 
      return null; 
    } 
} 

그 방법 :

public class SomeController 
{ 
    private IUserBll _repository; 
    public SomeController(IUserBll repository) 
    { 
    _repository = repository; 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(Someform f) 
    { 
     ... 
     _repository.AddUser(...); 
    } 
} 

당신은 예를 들어 StructureMap 컨트롤러 공장을 사용

은, MVC는 무대 뒤에서 컨트롤러에 종속성을 얻을 것이다.

+0

예, 저는 DI의 이점을 이해합니다. 그러나 여기서 중요한 문제는 사용자 유형을 다루는 것입니다. _repository.AddUser (...) 여전히 사용자 개체에서 전달합니까? – Icerman

+0

저의 요점은 (DI 프로젝트와 웹)과 (IUserBll과 웹이있는 프로젝트) 사이의 의존성을 만들어서 "인터페이스 사용의 초기 목표에 반하는 DAL과 웹 간의 의존성"을 만들 수 있다는 것입니다. 웹 프로젝트는 결코 DAL 프로젝트를 참조하거나 의존성을 갖지 않습니다. 컨트롤러 팩토리는 DAL.UserBll의 저장소 인스턴스화를 수행하고이를 IUserBll로 리턴합니다. – CRice

+0

동의. 내가 가지고있는 또 다른 퍼즐은 IUser와 DAL 및 웹에서의 구현입니다. IUser는 일반적인 속성을 정의하고 DAL과 웹은 DAL이나 웹에서만 추가되는 속성에 대해 다른 암시를 가질 수 있습니다. 그러나 웹 사용자를 DAL 사용자로 캐스팅하는 대신 IUserBll.AddUser (IUser)에 DAL 사용자 특정 등록 정보를 할당하는 것보다 IUser 등록 정보를 사용하여 DAL 사용자를 채울 필요가 있습니다. – Icerman

관련 문제