2016-07-20 2 views
5

AutoFac을 사용하여 현재 주체를 필요한 개체에 삽입하려고합니다. 보안 검사를 수행하는 객체 (AuthorizationValidator)가 있다고 가정합니다. AuthorizationValidator가 등록 내 웹 응용 프로그램의AutoFac : NULL 값을 입력하십시오.

public AuthorizationValidator : IAuthorizationValidator 
{ 
    public AuthorizationValidator(IDataAccess dataAccess, IPrincipal principal) 
    { 
    // Save injected objects 
    ... 
    } 

    public bool CheckPermission(Guid objectId, Action action) 
    { 
    // Check if we are authorized at all 
    if (this.principal == null) 
     return false; 

    // Check the permission in the database 
    ... 
    } 
} 

나는 교장 주입하기 위해 다음과 같은 등록을 사용합니다 : 그것은 다음과 같이 보입니다 응용 프로그램의

builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User); 

다른 유형을 사용하는 스레드의 교장이나 비슷한 . 주체를 필요로하는 모든 개체는 적절한 주체를 주입시킵니다.

인증없이 전화를 걸면 AutoFac에서 공장에서 null을 반환 했으므로 IPrincipal 개체를 제공 할 수 없다는 예외가 발생합니다. 이 경우, 빈 프린시 펄은 정상이며 예외를 발생 시켜서는 안됩니다.

public AuthorizationValidator : IAuthorizationValidator 
{ 
    public AuthorizationValidator(IDataAccess dataAccess, IPrincipalFactory principalFactory) 
    { 
    // Save injected objects 
    _dataAccess = dataAccess; 
    _principal = principalFactory.GetCurrentPrincipal(); 
    } 

    public bool CheckPermission(Guid objectId, Action action) 
    { 
    // Same as previous example 
    ... 
    } 
} 

public interface IPrincipalFactory 
{ 
    IPrincipal GetCurrentPrincipal(); 
} 

을 내가 IPrincipalFactory으로 다음 개체를 등록 할 ASP.NET 응용 프로그램의 경우 :

+0

Autofac 안에 무엇이 있는지 알 수는 없지만 이것이 작동 할 수있는 가능성이 있습니다 : 'builder.Register ((c, p) => (IPrincipal) HttpContext.Current? 사용자);' –

+0

일반적으로 말하자면, IoC 프레임 워크는 의도적으로 null을 주입시키지 않습니다. 그건 그냥 자동 팩 일이 아닙니다. –

+0

답안에서 제안한 것처럼 [Null Object pattern] (https://en.wikipedia.org/wiki/Null_Object_pattern)이 대안이 될 수 있습니까? – fknx

답변

5

Autofac documentation에서 이러한 시나리오에는 Null Object pattern을 사용하는 것이 좋습니다. 기본 인스턴스를 제공하는 readonlystatic 필드를 노출하는 전용 생성자를 사용하여 IPrincipal 인터페이스에서 상속받은 NullPrincipal 클래스를 만들 수 있습니다. 그럼 당신은 널 (null) 대신에이 인스턴스를 반환 할 수 있습니다 : 그것은 대신 NullPrincipal.Default 동일한 경우는 물론

builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User ?? NullPrincipal.Default); 

당신이 주체가 null의 경우 검사하는 코드에서 모든 장소를 업데이트하고 확인해야합니다.

1

이 문제를 해결하기 위해, 나는 AutoFac를 거치지 않고 현재 주를 얻을 수 IPrincipalFactory 인터페이스를 만들었습니다

public class IAspNetPrincipalFactory : IPrincipalFactory 
{ 
    public IPrincipal GetCurrentPrincipal() => HttpContext.Current?.User; 
} 

그래도 작동하지만이 솔루션에 만족하지 않습니다.