1

현재 Unity IOC 컨테이너를 사용하는 DDD 기반 응용 프로그램에서 작업하고 있으며 사용자 정의 Principal 개체를 단위 테스트를 허용하는 저장소 및 서비스 계층에 전달하는 방법이 필요합니다. 어떻게해야합니까? 내 생각은 IPrincipal 유형의 서비스 및 저장소 클래스에 대한 특성을 작성하는 것입니다. 그런 다음 Application_Start에서 Unity를 사용하여 Principal을 설정하고 전달하십시오.DDD : IPrincipal을 서비스 및 저장소 계층에 주입

하나는 내 생각에 올바른 길을 가고 있습니까?

둘 중 하나가 application_start에 없으면 주사가 일어나기 전에 먼저 로그인해야하는 사람이 필요하므로 올바른 위치가 아닌 것처럼 보입니다.

세 가지로, Unity의 경우 Thread.CurrentPrincipal 또는 HttpContext.Current.User에서 Principal을 가져 오기 위해 container.RegisterType이 어떻게 표시되어야합니까?

+0

귀하의 비즈니스에서 교장은 무엇입니까? 기술 용어로 도메인 모델을 오염 시키거나 경계가없는 문맥이 누락 된 것처럼 보입니다. – plalx

+0

주체는 현재 로그인 한 사용자의 사용자 자격 증명을 참조합니다. – user1790300

+0

교장 선생님이 아마도 비즈니스 용어가 아님을 깨닫게하는 것은 수사학적인 질문이었습니다. 이 개념은 도메인에 적합한 개념으로 변환되어야합니다. 교장 선생님은 어떤 종류의 작전을 수행합니까? – plalx

답변

0

서비스 계층에서 사용해야하는 관련 IPrincipal 속성이 포함될 PrincipalDto 클래스를 가질 수 있으며 IPrincipal에서 PrincipalDto로 값을 매핑 할 수 있습니다. 이렇게하면 IPrincipal의 참조 어셈블리를 다른 레이어에 포함 할 필요가 없습니다.

다음은 자동 매핑을 사용하는 예입니다.

public class PrincipalDto 
{ 
    public UserId { get; set; } 
    public Username { get; set; } 
    public RoleId { get; set; } 
} 

public class SomeService 
{ 
    public void SomeServiceMethod(PrincipalDto principal) 
    { 
     // do work here 
    } 
} 

public class SomeConsumer() 
{ 
    public void SomeConsumerMethod() 
    { 
     // where User is the IPrincipal object instance 
     var principal = Mapper.Map<PrincipalDto>(User); 

     var service = new Service(); 
     service.SomeServiceMethod(principal); 
    } 
} 
+0

이것에 관한 유일한 점은 매개 변수를 전달하지 않고도 서비스 계층과 저장소 계층이 사용자를 완벽하게 이해하도록 노력하고 있다는 것입니다. – user1790300