2011-01-03 11 views
2

일부 제품에 대한 새로운 일반 인증 프레임 워크를 설계하는 동안 좋은 해결책을 찾을 수없는 구조적인 문제가 발생했습니다.ASP.NET 모듈 종속성 주입

나는 이것을 쉽게 설명하기 위해 문제를 단순화하려고 노력했다. 현재 인증 된 사용자를 저장하기위한 책임인가

관리자 :

라이브러리는 두 개의 클래스가 있습니다.

모듈 모듈은 보안 정책에 따라 각 요청의 유효성을 검사해야합니다. 모듈은 사용자에게 현재 인증되었는지 여부를 관리자에게 확인해야합니다.

이제 관리자는 관리자가 저장소에서 사용자를로드 할 수있는 인터페이스 구현을 제공받습니다. 특정 구현은이 라이브러리에 포함되어 있지 않습니다. 이 때문에 라이브러리 내의 저장소 인스턴스를 직접 인스턴스화 할 수 없습니다.

모듈 생성자에 대한 속성을 수정하거나 인수를 제공 할 방법이 없습니다. 그래서 제 질문은 이것입니다, 어떻게 모듈을 Manager 인스턴스에 대한 참조로 제공 할 수 있습니까? 고전 ASP.NET에서

namespace Demo 
{ 
    public interface IRepository 
    { 
     object GetUser(int id); 
    }

public class Manager { public IRepository Repository { get; private set; } public Manager(IRepository repository) { this.Repository = repository; } } public class Module : IHttpModule { // How can i access an instance of the manager class here // when I am unable to instantiate an instance of // of an implementation of the IRepository interface. }

}

+1

무엇을해야한다고 생각 당신은 당신이 뭘하려는 건지 보여주기 위해 일부 의사 코드 구현을 게시 할 수 있습니까? –

답변

2

, 나는에 인터페이스를 구현하는 것을 선호 내 필요한 종속성을 선언 HttpApplication (Global). 여기서, (응용 프로그램이 웃는 고양이에 의해 작성되었습니다) IHasManager입니다 : 간단한의

public class Module: IHttpModule { 
    Manager manager; 
    public void Init(HttpApplication context) { 
     IHasManager application = context as IHasManager; 
     if (application != null) { 
      manager = application.Manager; 
     } 
    } 
} 
0

하나 (추한 경우) 방법입니다 응용 프로그램을 사전에 관리자 인스턴스를 쑤셔 당신이 그것을 만든 후 :

HttpContext.Current.Application["Demo.Manager"] = new Manager(new Repository()); 

이제 모듈에서 모듈에 액세스 할 수 있습니다.

var manager = HttpContext.Current.Application["Demo.Manager"] as Manager;