2

현재 ASP.Net MVC 4 SAAS 응용 프로그램 (C#)을 빌드 중이며 계획을 세우려 고합니다. 내 말은 고객이 Plan A을 골라 몇 가지 항목에 액세스해야하고 그들이 Plan B을 선택하면 다른 사람에게 액세스하는 등의 의미입니다.ASP.NET MVC 4의 전역 변수

내가 붙어있는 부분은 계정의 계획을 모든 작업과 공유하는 가장 좋은 방법입니다. 나는 글로벌 변수가 나쁜 습관이라는 것을 알고 있지만 모든 행동에 대해 계획을 세우기 위해 DB에 왕복 여행을하고 싶지 않습니다.

내가 생각하고있는 것은 This SO answer과 같은 것으로, 정적 모델을 선언하고 나중에 어떤 지점에서 설정하고 나중에 액세스 할 수 있습니다. 귀하의 의견으로는, 이것이 최선의 방법입니까? 거기에 더 좋은 방법이 있습니까?

+0

**하지만 모든 작업에 대한 계획을 세우기 위해 DB 로의 왕복 이동을 원하지 않습니다. ** 아래의 접근 방식은 각 작업에 대한 db 호출을 만들려고합니다. 맞습니까? –

+0

@PKKG : 한 번만로드되는지 확인하는 검사가 있습니다. –

+0

@Khanh : 그것은 데이터의 메모리가 아니라 인터페이스의 메모리입니다. 권리 ? 그래서 각각의 요청은 db –

답변

5

프로젝트에 IoC를 포함시키고 컨트롤러에 구성 개체를 삽입해야한다는 것이 가장 좋은 방법이라고 생각합니다. 컨트롤러의

예제 코드 :

public class YourController : Controller 
{ 
    private IConfigService _configService; 

    //inject your configuration object here. 
    public YourController(IConfigService configService){ 
      // A guard clause to ensure we have a config object or there is something wrong 
      if (configService == null){ 
       throw new ArgumentNullException("configService"); 
      } 
      _configService = configService; 
    } 
} 

이 구성 객체에 대해 단일 범위를 지정하기 위해 IOC의를 구성 할 수 있습니다. 이 패턴을 모든 컨트롤러에 적용해야하는 경우 기본 컨트롤러 클래스를 만들어 코드를 다시 사용할 수 있습니다.

귀하의 IConfigService

public interface IConfigService 
{ 
    string ConfiguredPlan{ get; } 
} 

귀하의 ConfigService :

public class ConfigService : IConfigService 
{ 
    private string _ConfiguredPlan = null; 

    public string ConfiguredPlan 
    { 
     get 
     { 
      if (_ConfiguredPlan == null){ 
        //load configured plan from DB 
      } 
      return _ConfiguredPlan; 
     } 
    } 
} 
이 클래스는 쉽게 연결 문자열, 기본 제한 시간, 같은 더 구성을 포함하도록 확장되어
  • ... 우리는있어
  • 컨트롤러 클래스에 인터페이스를 전달하면 유닛 테스트 중에이 객체를 모의하기가 쉽습니다.
+0

와우, 정말이 솔루션이 마음에 든다. 나는 그것을 내일 구현하려고 노력할 것이다. 감사! – hjavaher

+0

@hjavaher : 당신이 좋아하는 것을 기쁘게 생각합니다. 당신이 일하게되기를 바랍니다. –

+0

나도 마찬가지다. 나는 DI에 관해서 정말로 newbee 다. 나는 그런 식으로 생각하기 시작해야만한다. – hjavaher