0

비즈니스 로직 및 데이터 호출이 별도의 어셈블리로 포함되어있는 asp.net 웹 솔루션을 상속 받았습니다. 비즈니스 계층에는 HttpContext 세션 값을 가져 오거나 설정할 수있는 호출 수가 적습니다. 웹 로직이 아닌 프로젝트에서이 어셈블리를 재사용 할 수 있기를 원하는 비즈니스 로직에서 이것을 추상화 할 수있는 예제를 살펴 보았습니다. 아무리 나에게 최선의 방법을 보여줄 수 있습니까? 이 작업을 수행. 사용 시나리오에 따라 일종의 지속적인 저장소에서 값을 얻을 수있는 일종의 세션 팩토리를 생각하고 있었지만 아키텍처에 익숙하지 않고 포인터 나 두 가지 점을 고맙게 생각합니다.비즈니스 로직에서 ASP.net 세션 호출을 제거합니다.

+0

어떤 종류의 값이 세션 상태에 저장됩니까? –

+0

지금은 Guid 목록으로 사용자 세부 정보와 데이터 권한을 포함하는 복잡한 유형입니다. –

답변

-1

비즈니스 계층에 세션이있는 비즈니스는 무엇입니까? 그 진술을 좀 더 이해하려면 다음과 같이 생각하십시오. 비즈니스 계층이 사용자 관련 정보를 계속 유지해야하는 이유는 무엇입니까?

비즈니스 계층은와 작업과 과정 사용자 관련 데이터를 필요로하지만 상점은을. 이는 현재 저장되어있는 데이터를 주입해야 함을 의미합니다. 즉, 필요한 데이터를 매개 변수로 전달해야합니다. 이 방법으로 건축 계약을 맺는 것은 매우 명확한 방법으로 "이봐, 내 일을하는 데 필요한 사용자 정보"가 필요하다는 것을 의미한다. 이전에 저장된 무작위 값으로 무언가를 수행하지는 않을 것이다. 비즈니스 계층에서는 해당 데이터를 사용하여 사용자를 인증 또는 승인하는 것이 좋지만 인증 결과가 끝나면 폐기해야합니다. 값이 데이터베이스에 하나 또는 두 개의 호출을 저장하도록 지속되는 경우 데이터베이스 호출의 효율성에 문제가 있습니다. 데이터베이스 호출은 그와 같은 간단한 작업을 신속하게 호출하기 때문에 발생합니다.

내 제안은 비즈니스 계층에서 Session에 대한 참조를 제거하고 전달해야하는 사용자 데이터를 포함하도록 기능 서명을 변경하는 것입니다.

+0

리플렉션에서 올바른지, 그 레이어에 값을 저장하고 싶지는 않습니다. 단순히 세션에서 현재 지속되는 데이터를 레이어에서 사용할 수있게하려는 것입니다. 이 예에서는 Session에 저장된 Guid 목록이 데이터베이스에 직접 반영되므로 필요한 경우 여기에서 검색 할 수 있습니다. 내가 정말로 원했던 것은이 데이터에 대한 요청을 제 3 자 (세션 팩토리)에게 넘기는 것이고 이것이 가장 적합한 장소에서 목록을 반환한다는 것이 었습니다. UI와 데이터베이스에서 호출되는 Session입니다. 그렇지 않다면. –

+0

굉장한 ... 나는 득표 한 곳에서 투표를 거부 한 것이 아니라, 투표 한 사람으로부터 나의 실수로 교육받는 것을 좋아할 것이다.나는 2 포인트를 놓치지 않는다. 그것은 단지 원칙의 문제 일 뿐이다. – slugster

0

내 생각에 가장 간단한 방법은 Dictionary<string, object> {get; }ISessionProvider 인터페이스를 만드는 것입니다. 실제 세션 백 내용을 반환하는 public class HttpSessionProvider : ISessionProvider을 만듭니다.

최소한이 객체를 웹 응용 프로그램에서 인스턴스화하고 수동으로 지정하거나 IOC 패턴을 사용하여 백엔드 클래스에 지정합니다.

[편집] 작은 반사 후 [편집] 깨끗한 방법이 아닙니다. asp.net 프레임 워크에 대한 종속성은 없지만 여전히 세션의 "asp.net"내용에 액세스 할 수 있습니다. 이 경우 , 인터페이스를 유지하지만, 하나는 특정 속성 (문자열 고객 INT의 사용자 ID 등)을 추가하거나 나만 일부 프로젝트에이 같은 짓을

0

실제 비즈니스 데이터와 함께 사전을 반환 :

public interface IAppContext { 
    string SomeVariable { 
     set; 
     get; 
    } 
} 
public class HttpContextAppContext : IAppContext { 

    public static readonly string CONTEXT_PREFIX = "appcontext_"; 

    public string SomeVariable { 
     set { HttpContext.Current.Session[CONTEXT_PREFIX + "SomeVariable"] = value; } 
     get { return (string)HttpContext.Current.Session[CONTEXT_PREFIX + "SomeVariable"]; } 
    } 
}